如何在dask / distributed中存储worker-local变量

时间:2017-07-10 09:50:20

标签: python distributed dask

使用dask 0.15.0,分发1.17.1。

我想记住每个工作人员的一些事情,比如访问谷歌云存储的客户端,因为实例化它很昂贵。我宁愿把它存储在某种工人属性中。这样做的规范方法是什么?或者全局变量是要走的路?

2 个答案:

答案 0 :(得分:4)

关于工人

您可以使用get_worker功能访问本地工作人员。比全局变量更简洁的是将状态附加到worker:

from dask.distributed import get_worker

def my_function(...):
    worker = get_worker()
    worker.my_personal_state = ...

future = client.submit(my_function, ...)

我们应该在worker上添加一个通用命名空间变量,作为这样的信息的一般位置,但还没有。

作为Globals

尽管如此,对于与外部服务连接的事情,全局变量并不完全是邪恶的。像Tornado这样的许多系统使用全球单身人士。

如果您关心线程安全

请注意,工作人员通常是多线程的。如果您的连接对象不是线程安全的,那么您可能需要为每个线程缓存一个不同的对象。为此,我建议使用threading.local对象。 Dask在

使用一个
from distributed.worker import thread_state

答案 1 :(得分:0)

动作演员

对于更简单的用例,其他解决方案可能更可取;但是,值得Actor考虑。 Actor目前是Dask中的一项实验功能,可启用状态计算。

Dask Actors