为啥多处理工作者不能更改全局变量? [复制]
Posted
技术标签:
【中文标题】为啥多处理工作者不能更改全局变量? [复制]【英文标题】:Why can't multiprocessing workers change a global variable? [duplicate]为什么多处理工作者不能更改全局变量? [复制] 【发布时间】: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
【参考方案1】:
全局变量不跨进程共享。在一个进程中设置全局变量只会在该进程中更改它。
【讨论】:
有没有办法在不使用文件的情况下改变它?喜欢共享内存?此外:这是否意味着回调函数不是另一个进程,因此不是并行处理的? 现在有 multiprocessing.shared_memory以上是关于为啥多处理工作者不能更改全局变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章