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

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__'。因此,没有运行将所有键添加到字典的代码。

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

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