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

问题描述 投票:0回答:1

我有一个正在使用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

python python-3.x multiprocess
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.