【发布时间】:2015-07-10 11:47:40
【问题描述】:
我有一个名为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()
我可以看到,worker 本身似乎无法更改全局变量,相反,该值仅在 worker 的范围内更改。一旦我取消注释
changed=True
回调函数log_result中的行,变量按预期设置。这是否意味着,工作进程不会以并行方式调用回调函数,因为全局变量在进程之间是不可共享的。
【问题讨论】:
-
骗子谈到实现一个计数器,但可以应用完全相同的原理 - 使用
multiprocessing.Value来表示您的changed变量,并将其显式传递给孩子。 -
我的回答已经说明了如何解决问题的问题。我试图了解回调函数是否与工作者不同,如果这意味着对回调的调用不是并行发生的。
-
回调在主进程的后台线程中运行,而不是在子进程中。见this question
标签: python global-variables multiprocessing