初始化dask分布的工人的状态

时间:2019-01-31 21:44:35

标签: python python-3.x multiprocessing dask dask-distributed

我正在尝试做类似的事情

resource = MyResource()
def fn(x):
   something = dosemthing(x, resource)
   return something

client = Client()
results = client.map(fn, data)

问题在于resource不可序列化,并且构造成本很高。 因此,我想在每个工人上构造一次,并且fn可以使用它。

我该怎么做? 还是有其他方法可以使resource在所有工作人员中可用?

1 个答案:

答案 0 :(得分:1)

您总是可以构造一个惰性资源,例如

class GiveAResource():
    resource = [None]
    def get_resource(self):
        if self.resource[0] is None:
            self.resource[0] = MyResource()
        return self.resource[0]

一个这样的实例可以很好地在进程之间进行序列化,因此您可以将其作为要在worker上执行的任何函数的输入,然后在其上调用.get_resource()将获得您本地的昂贵资源(该资源将对以后出现的任何工人进行翻新。

最好在模块而不是动态代码中定义此类。

这里没有锁定,因此,如果到目前为止没有需要多个线程同时请求资源,那么您将获得多余的工作。