我有一个正在使用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__'
。因此,没有运行将所有键添加到字典的代码。
我将更改程序以将全局变量作为参数显式传递给函数,因为在我的实际代码中,计算成本很高。