我想在工作程序加载时分发更大的对象(或从磁盘加载),并将其放入全局变量(例如calib_data
)中。这对愚蠢的工人有用吗?
答案 0 :(得分:1)
好像客户端的方法register_worker_callbacks可以做你在这种情况下,想要的东西。您仍然需要的地方的把你的变量,因为在Python中没有真正的全球范围。这地方可能是导入模块的任何属性,例如,其中,那么,任何工人将有机会获得。你也可以将其添加为工人实例本身的属性,但我看不出有什么明显的理由要做到这一点。
一种可行的方法,劫持随机选择的内置模块;但我不特别推荐这样做(见下文)
def attach_var(name, value):
import re
re.__setattr__(name, value)
client.run(attach_var, 'x', 1)
def use_var():
# any function running on a worker can do this, via delayed or
# whatever method you pass with
import re
return re.x
client.run(use_var)
不过,在继续之前,您是否已经考虑过delayed(calib_data)
或scatter
,这会将您的变量复制到所需的位置,例如
futures = client.scatter(calib_data, broadcast=True)
或实际上使用普通的delayed
语义将数据加载到工作程序中
dcalib = dask.delayed(load_calib_data)()
work = dask.delayed(process_stuff)(dataset1, dcalib)