进程池工作程序忽略全局变量更新
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下多进程时全局变量在子进程怎么能更新?遇到从子进程更
C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段