为啥多处理工作者不能更改全局变量? [复制]

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

以上是关于为啥多处理工作者不能更改全局变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

父进程全局变量如何复制到python多处理中的子进程

为啥全局修饰符不能正常工作?

为啥我的函数使用局部变量而不是全局变量? [复制]

多处理池中的全局变量

为啥全局变量不添加到浏览器的窗口对象? [复制]

linux多线程编程 -- __thread