2012-09-27 121 views
4

似乎我無法在使用從pprocess調用的函數時修改Python中的全局變量。這是我的例子:Python:如何使用pprocess修改函數中的全局變量

import pprocess 
import time 

numbers=[0,0,0,0,0,0,0,0,0,0] 

# find system time and store in global variable 
def find_time(index): 
    global numbers 
    x=time.time() 
    print "Setting element %s of numbers to %f" % (index, x) 
    numbers[index]=x 
    return x 

# parallel execution of the function 
results=pprocess.pmap(find_time, [0,1,2,3,4,5,6,7,8,9], limit=6) 

for y in results: 
    print '%f' % y 

# this list is unchanged 
print numbers 

# serial execution of the function 
for x in [0,1,2,3,4,5,6,7,8,9]: 
    find_time(x) 

# now it seems to work 
print numbers 

「數字」只是零的名單,併爲示範的緣故,我正在嘗試設置每個列表元素,以當前系統時間。當使用pprocess調用時,這不起作用,但是當我使用簡單的for循環來調用函數時,全局變量會發生變化。

我花了一些時間閱讀全局變量,真心希望這不是一個微不足道的問題。有人可以向我解釋發生了什麼事嗎?

非常感謝,

恩諾

+0

另請注意,這裏不需要'global'關鍵字。即使您沒有將其定義爲全局對象,Python也會高興地改變全局對象。如果你通過賦值改變對象的變量引用,你只需要'global'。 – mgilson

回答

0

pprocess創建另一個進程。這意味着它不會與調用代碼共享內存。並行進程修改的任何內容都將在其自己的內存空間中進行修改,因此調用代碼的內存空間將保持不變。那是 - 他們不共享全局變量。

你必須做你的兩個明確之間的所有通信,通過管道或任何pprocess優惠或插座等

1

我的理解是,pprocess使用subprocessing引擎蓋下。如果是這種情況,那麼每次運行該功能時,它都是一個單獨的過程。所以當你的函數返回時,這些變化不會顯示出來。

您可能需要將該列表設爲multiprocessing.Manager

例如

numbers = multiprocessing.Manager().list([0]*10) 
+0

感謝您的回覆。我認爲實現這一點已經超出了我的編程能力,所以現在我已經通過將數據寫入磁盤並在稍後讀取它們(幸運的是不會產生瓶頸)而創建了一條繞道。 – mcenno

相關問題