首页 > 解决方案 > 多处理:不能在文件之间共享变量

问题描述

我用一个最小的例子来描述我的问题。在我的项目中,一个config文件包含一个param由所有其他模块使用的变量:

# config.py
param = -1

config导入solver其中执行基于传递valparam来自配置的计算:

# solver.py
import config

def solve(val):
    # some computation using val and config.param
    print('solver uses param:', config.param)
    return None

我的目标是为一些param和各种vals 执行计算。

# main.py
import multiprocessing as mp
import config, solver

val_list = [None for i in range(3)]
pool = mp.Pool(10)
config.param = 1
print('testing param: ', config.param)
results = pool.map(solver.solve, [val for val in val_list]) # multiprocessing
#results = [solver.solve(val) for val in val_list]          # basic

在使用多处理时,我得到一个输出:

testing param:  1
solver uses param: -1
solver uses param: -1
solver uses param: -1

这意味着paramin的变化main不会被solver. 但是,在使用基本的 for 循环计算时可以看到:

testing param:  1
solver uses param: 1
solver uses param: 1
solver uses param: 1

如何通过多处理获得所需的行为?请注意,param不应手动更改 of config,因为实际上我param在 for 循环中测试了不同的值。我在 Linux 上使用 Python 3.6.9。谢谢!

标签: pythonmultiprocessingglobal-variablespython-import

解决方案


当你打电话给你的那一刻,mp.Pool(10)你创建了 10 个处于“等待模式”的新进程,直到你给它们运行一些东西,但它们已经从你的进程中分叉出来,所以对局部变量的任何更改都不会影响它们

如果您想向他们传递信息,您需要:

当您调用它们时将其传递给它们(只需添加类似的内容pool.map(solver.solve, [(val, config.param) for val in val_list]然后solve拆分这些参数)

或者您需要创建config.param一个可以在进程之间共享的变量,可能使用multiprocessing.Value如下:

# config.py
import multiprocessing as mp
param = mp.Value("i", -1)

那么您可以像这样访问该值:config.param.value


推荐阅读