【问题标题】: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

标签: python global-variables multiprocessing


【解决方案1】:

全局变量不跨进程共享。在一个进程中设置全局变量只会在该进程中更改它。

【讨论】:

  • 有没有办法在不使用文件的情况下改变它?喜欢共享内存?此外:这是否意味着回调函数不是另一个进程,因此不是并行处理的?
  • 现在有 multiprocessing.shared_memory
猜你喜欢
  • 1970-01-01
  • 2022-01-09
  • 2014-01-25
  • 1970-01-01
  • 2018-05-28
  • 2015-03-17
  • 2023-03-09
  • 2019-05-04
  • 2021-07-18
相关资源
最近更新 更多