2014-07-06 67 views
0

我想執行以下任務:在主程序'main.py'中,我定義了一些輸入參數,使用函數f()和存儲結果。函數f()和一些參數在中央模塊「test.py」中定義。Python多重處理:避免在進程之間通過模塊進行通信

我必須爲大量參數做這件事,因此要給每個CPU一組參數,執行計算並返回結果,然後將結果存儲在數組'data'中。

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

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

如果一個執行人們可以看出在「數據」的結果是正確的計算,但打印語句返回對(A,B)不對應於默認值。

起初,我想了解這裏發生了什麼。看來,每個進程打印(a,b)由先前的進程定義,然後定義新的值併產生正確的結果。其次,目前該程序可以工作(即使對於較大的數據集和更復雜的計算),但我不想冒着由進程之間的干擾導致錯誤結果的風險。有沒有辦法避免流程之間的任何溝通?也許每個進程都獲得模塊的副本,並使用此副本進行計算?

回答

1

我認爲你的問題是「print」語句正在打印父main.py進程看到的ta和tb,你已經在calc(x)函數中賦值了(我認爲你不能打印在童工過程中,但你肯定沒有,因此我看不到你如何看到默認值(1,1)。在分配新值之前打印ta和tb,因此它會打印舊值?

如果你真的想確保你所有的過程是獨立的100%主進程,你可以通過所有的arguements在一個結構即定義您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

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

Cheeers mate and goodluck。

+0

是的,打印語句返回它在當時獲得的模塊對(a,b)。但是,這並不是真正的可預測性,我不明白爲什麼計算結果仍然正確。我的意思是,一名童工可以重新定義t.a,t.b,而另一名童工使用這個數值來給出錯誤的結果。 我想你的建議沒有辦法做出一個包含參數的結構。缺點是我必須在整個程序中攜帶包含大量參數的結構。我會考慮的,謝謝。 – hauntergeist

+0

我在配對之前就有這個問題,這取決於你的「a」和「b」值多久改變一次,我假設這只是一個代表性的功能,因爲你不能公開你的真實源代碼。如果許多具有不同s值的對象使用相同的a和b,並且希望將它們從內存中移除,則可以使用3層系統,其中祖父進程使用a和b值創建父進程,然後創建s值列表它映射到。如果計算完成,你可以結束父進程清除內存。 – PythonFan