如何在dask / distributed中存储工人局部变量

Vin*_*hut 6 python distributed dask

使用dask 0.15.0,分发了1.17.1。

我想记住每个工作人员的一些事情,例如访问Google云存储的客户端,因为实例化它很昂贵。我宁愿将此存储在某种worker属性中。规范的做法是什么?还是全球人走的路?

MRo*_*lin 6

对工人

您可以使用get_worker函数访问本地工作人员。比全局变量更干净的事情是将状态附加到工人身上:

from dask.distributed import get_worker

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

future = client.submit(my_function, ...)
Run Code Online (Sandbox Code Playgroud)

我们可能应该在worker上添加一个通用的名称空间变量,以充当此类信息的通用场所,但目前还没有。

作为全球

话虽这么说,对于诸如与外部服务的连接之类的事情,全球并不完全是邪恶的。龙卷风之类的许多系统都使用全局单例。

如果您关心线程安全

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

from distributed.worker import thread_state
Run Code Online (Sandbox Code Playgroud)