我有一个我想要执行的任务的并行列表,令人尴尬。目前我正在将这些任务的配置作为模块导入。
单行配置示例.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
为什么我不能再将此模块作为参数传递?
分布式使用pickle将值发送给worker。对于模块,这本质上只是模块的名称,以便工作程序执行导入,而不是保存模块的当前状态,发送该状态,然后在工作程序中重新创建它。
如果您想以这种方式向工作任务发送信息,则需要发送普通变量(类实例等)而不是模块对象。或者,您可以进行关闭,或在工作人员上运行
conf.result_folder = "newFold"
行,或者......可能有很多选择。