2015-04-30 97 views
0

我有一個全局變量,名爲changed。在一個簡單的多處理環境中,我想要改變這個全局變量,這取決於一個專門工作人員的工作。一個最小的例子來重現我的輸出是:爲什麼多處理工人不能更改全局變量?

import multiprocessing as mp 
changed=False 
def log_result(result): 
    global changed 
    if result==50: 
     print 'Callback changed' 
     #changed=True 

def change(i): 
    global changed 
    if i==51: 
     print 'changed' 
     changed=True 
     print changed 
    return i 

def parallel(): 
    global changed 
    print 'Start Multiprocessing' 
    pool = mp.Pool(processes=4) 
    for i in range(100): 
     pool.apply_async(change, args = (i,), callback=log_result) 
    pool.close() 
    pool.join() 
    print "Multiprocessing done!" 

parallel() 

我所看到的,是工人本身似乎並不能改變全局變量,相反,該值僅在工人的範圍內變化。一旦一個我取消的回調函數log_result

changed=True 

線按預期的變量。這是否意味着回調函數不是由工作進程以並行方式調用,因爲全局變量在進程之間不可共享。

+0

關於實現一個計數器的僞裝說,但可以應用完全相同的原則 - 使用'multiprocessing.Value'來表示你的'changed'變量,並明確地將它傳遞給孩子。 – dano

+0

我的答案已經指出瞭如何解決這個問題。我試圖瞭解回調函數是否與worker不同,如果這意味着對回調的調用不是並行發生的。 – Dschoni

+1

回調在主進程的後臺線程中運行,而不是在子進程中運行。看到[這個問題](http://stackoverflow.com/questions/24770934/who-runs-the-callback-when-using-apply-async-method-of-a-multiprocessing-pool) – dano

回答

0

全局進程不在進程間共享。在一個進程中設置一個全局變量只會在該進程中進行更改。

+0

有沒有辦法,改變這一點,而不使用文件?像共享內存一樣? 此外:這是否意味着,回調函數不是另一個進程,因此不能並行處理? – Dschoni

相關問題