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