簡體   English   中英

Python多處理:避免通過進程之間的模塊進行通信

[英]Python multiprocessing: avoid communication via module between processes

我要執行以下任務:在主程序“ main.py”中,我定義了一些輸入參數,使用函數f()根據這些參數進行計算並存儲結果。 函數f()和某些參數在中央模塊“ test.py”中定義。

我必須對大量參數執行此操作,因此要為每個CPU提供一組參數,執行計算並返回結果,然后將結果存儲在數組“數據”中。

問題:每個進程都需要訪問和定義模塊“ test.py”中的值,我想避免進程之間的任何通信/干擾。

我附上了一個最小的工作示例。 主文件main.py和模塊test.py

如果執行計算,則會看到“數據”中的結果正確,但是print語句返回的對(a,b)與默認值不對應。

首先,我想了解這里發生的情況。 似乎每個過程都打印由先前過程定義的(a,b),然后定義新值並產生正確的結果。

其次,目前該程序可以運行(即使對於較大的數據集和更復雜的計算),但我不想冒流程之間相互干擾的錯誤結果的風險。 有沒有辦法避免流程之間的任何交流? 也許每個進程都獲得模塊的副本,並且使用此副本進行計算嗎?

我認為您的問題是“ print”語句正在打印您在calc(x)函數中分配的父main.py進程所看到的ta和tb((我認為您不能在孩子中打印)工作進程,但您肯定不滿意,因此我看不到如何看到默認值(1,1)。在分配新值之前先打印ta和tb,然后它將打印舊值?

如果您真的想確保所有過程都與主過程100%獨立,則可以在一個結構中通過所有論點。 在您的test.py中定義

def f(struct):
    return (struct.a+struct.b)**struct.s

並在您的main.py中列出這些結構。 所以我想你定義一個結構並填充它

class myStruct():
    def __init__(self,s,a=1,b=1): ##Here you've set the default a and b values to 1
        self.a=a
        self.b=b
        self.s=s

然后,您可以填充這些結構的列表,然后將該列表傳遞給multiprocessing.pool。

不知道這是否超級有用,但我沒有足夠的聲譽來發表評論。

歡呼隊友和好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM