进程池工作程序忽略全局变量更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程池工作程序忽略全局变量更新相关的知识,希望对你有一定的参考价值。

我有一个正在使用concurrent.futures.ProcessPoolExecutor运行的功能。该函数在字典中查找键。字典是全局变量。该函数不修改字典本身。

但是,即使在启动任何工作线程之前进行了修改,进程池工作线程也无法识别我对if __name__ == '__main__:块内的字典所做的任何更改。

这是我的MRE:

import concurrent.futures

NUM_KEYS=30

D={}

def func(key):
    return D[key]

if __name__ == '__main__':
    for k in range(NUM_KEYS):
        D[k]=k*10
    executor=concurrent.futures.ProcessPoolExecutor(max_workers=4)
    results={k: executor.submit(func,k) for k in range(NUM_KEYS)}
    for future in results.values():
        print(k,future.result())

每个工作人员失败,并出现KeyError

答案

似乎每个子进程都重新运行了整个文件。在这些过程中,__name__不再等于'__main__',而是'__mp_main__'。因此,没有运行将所有键添加到字典的代码。

我将更改程序以将全局变量作为参数显式传递给函数,因为在我的实际代码中,计算成本很高。

以上是关于进程池工作程序忽略全局变量更新的主要内容,如果未能解决你的问题,请参考以下文章

并行池不识别全局变量

python的内存驻留机制(小数据池)

python下多进程时全局变量在子进程怎么能更新?遇到从子进程更

多处理全局变量更新未返回给父级

GIL全局解释器锁和进程池.线程池

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段