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

Process pool worker ignoring global variable update

我有一个 运行 使用 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__'。因此,将所有键添加到字典的代码不是 运行.

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