python - 多处理:不能在文件之间共享变量
问题描述
我用一个最小的例子来描述我的问题。在我的项目中,一个config
文件包含一个param
由所有其他模块使用的变量:
# config.py
param = -1
被config
导入solver
其中执行基于传递val
和param
来自配置的计算:
# solver.py
import config
def solve(val):
# some computation using val and config.param
print('solver uses param:', config.param)
return None
我的目标是为一些param
和各种val
s 执行计算。
# 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
这意味着param
in的变化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。谢谢!
解决方案
当你打电话给你的那一刻,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
推荐阅读
- python - 函数内的 if 语句并在用户输入后打印出特定值
- javascript - 使用 JavaScript,如何在子对象中使用多个条件过滤对象数组
- python - ValueError:无法设置张量:尺寸不匹配。得到 3 但预期 4 用于输入 0
- python - 如何在 QTableWidget 上选择行并将值返回给 QLineEdit
- python - 在 for 循环中生成子进程
- c# - ASP.NET MVC DropDownList 重定向到 Eidt 视图
- python - Discord.py 发送消息
- javascript - 将一个对象数组中的项目作为数组包含在第二个对象数组的每个对象中(按键)
- javascript - 使用 Nonce 从脚本中读取 Javascript 变量
- android - Android:从应用程序以编程方式打开开发人员选项时遇到“静默”崩溃