2010-05-05 41 views
5

我正在使用ParallelPython來開發一個性能至關重要的腳本。我想在系統上運行的8個進程之間共享一個值。請原諒這個微不足道的例子,但這說明了我的問題。並行共享值python

def findMin(listOfElements): 
    for el in listOfElements: 
     if el < min: 
      min = el 

import pp 
min = 0 
myList = range(100000) 
job_server = pp.Server() 
f1 = job_server.submit(findMin, myList[0:25000]) 
f2 = job_server.submit(findMin, myList[25000:50000]) 
f3 = job_server.submit(findMin, myList[50000:75000]) 
f4 = job_server.submit(findMin, myList[75000:100000]) 

pp文檔似乎沒有描述跨進程共享數據的方式。可能嗎?

如果是這樣,是否有一個標準的鎖定機制(如線程模塊中)來確認一次只進行一次更新?

l = Lock() 
if(el < min): 
    l.acquire 
    if(el < min): 
     min = el 
    l.release 

我明白我可以保持一個本地分鐘,比較4在主線程返回一次,但通過共享的價值,我可以做我的BFS二叉樹的一些更好的修剪和節省很多的循環迭代。

Thanks-

喬納森

回答

0

我不知道的PP模塊,但你總是可以存儲在一個臨時文件中的最低值。我唯一擔心的是你會花大部分時間來獲取和釋放鎖。唯一的例外是如果您的el < min操作非常耗時。

我實際上會說,你的「合併」技術可能是要走的路。

順便說一句,我明白你爲簡潔起見給出了一個簡單的代碼示例,但不要使用min作爲變量名......它會在調試時引起很多頭疼。

0

您不會通過共享值來保存任何迭代,您需要至少讀取列表中的每個元素一次。而且,它會更慢,因爲每次使用共享值時都需要鎖定。

對於你的情況,如果你想要更多的性能,你應該分別計算每個零件的最小值,並在主線程中比較這些結果。

另一方面,將列表傳遞給其他進程可能會比單遍查找列表的最小值更耗費資源。

1

並行Python在不同的進程上運行子功能,所以沒有共享內存,這意味着你不應該使用共享的值。 clackle提到的回調示例將獲取每個函數的結果,並將它們組合到原始進程中運行的回調函數中。要正確使用它,你應該做類似的事情;在給出的示例中,您將計算局部最小值並使用回調函數來查找所有子結果的最小值。希望在你的真實情況下,你可以做類似的事情。