为什么对 python 模块变量的修改没有传播到新的并行进程?

问题描述 投票:0回答:1

我有一个我想要执行的任务的并行列表,令人尴尬。目前我正在将这些任务的配置作为模块导入。

单行配置示例.py:

result_folder = "aFolder"

到目前为止,我一直在串行而不是并行调用我的函数

def embarassing(x, conf):
    print(x)
    print(conf.result_folder)
    # ... do complicated things and return a value

if __name__ == "main":
    import configuration as conf
    x = 1
    y = embarassing(x, conf)

现在我已经更新了代码以利用并行运行这些任务的优势。

from dask.distributed import Client
# ...
if __name__ == "main":
    import configuration as conf
    client = Client(n_workers=1)
    x = 1
    future = client.submit(embarassing, x, conf)
    y = future.result()

这一切都很好。问题是有时我想运行一组临时案例,到目前为止我总是可以添加

import configuration as conf
x = 2
conf.result_folder = "newFold"

代码将会打印出来

2
newFold

但是在并行代码下,它打印

2
aFolder

为什么我不能再将此模块作为参数传递?

python python-multiprocessing dask python-module dask-distributed
1个回答
0
投票

分布式使用pickle将值发送给worker。对于模块,这本质上只是模块的名称,以便工作程序执行导入,而不是保存模块的当前状态,发送该状态,然后在工作程序中重新创建它。

如果您想以这种方式向工作任务发送信息,则需要发送普通变量(类实例等)而不是模块对象。或者,您可以进行关闭,或在工作人员上运行

conf.result_folder = "newFold"
行,或者......可能有很多选择。

© www.soinside.com 2019 - 2024. All rights reserved.