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
線按預期的變量。這是否意味着回調函數不是由工作進程以並行方式調用,因爲全局變量在進程之間不可共享。
關於實現一個計數器的僞裝說,但可以應用完全相同的原則 - 使用'multiprocessing.Value'來表示你的'changed'變量,並明確地將它傳遞給孩子。 – dano
我的答案已經指出瞭如何解決這個問題。我試圖瞭解回調函數是否與worker不同,如果這意味着對回調的調用不是並行發生的。 – Dschoni
回調在主進程的後臺線程中運行,而不是在子進程中運行。看到[這個問題](http://stackoverflow.com/questions/24770934/who-runs-the-callback-when-using-apply-async-method-of-a-multiprocessing-pool) – dano