dask.distributed中的信号量?

时间:2018-02-07 15:23:49

标签: dask dask-distributed

我有一个带有n个worker的dask集群,希望worker能够对数据库进行查询。但是数据库只能并行处理m个查询,其中m

我看到分布式支持锁(http://distributed.readthedocs.io/en/latest/api.html#distributed.Lock)。但有了这个,我只能并行执行一个查询,而不是m。

我也看到我可以为每个工人定义资源(https://distributed.readthedocs.io/en/latest/resources.html)。但这也不合适,因为数据库独立于工人。我要么必须为每个worker定义1个数据库资源(这会导致太多的并行查询)。或者我必须将m个数据库资源分配给n个工作者,这对于设置集群和执行中的次优很困难。

是否有可能在dask中定义类似信号量的东西来解决这个问题?

2 个答案:

答案 0 :(得分:1)

你可能会和Locks and Variables一起破解。

更清洁的解决方案就是实现Semaphores,就像Locks的实现方式一样。根据您的经验,这可能不是那么难,(锁实现是150行)并且是一个欢迎拉取请求。

https://github.com/dask/distributed/blob/master/distributed/lock.py

答案 1 :(得分:0)

您可以使用dask.distributed.Queue

class DDSemaphore(object):
    """Dask Distributed Semaphore"""

    def __init__(self, value=1):
        self._q = dask.distributed.Queue()
        for _ in range(value):
            self._q.put(42)

    def acquire():
        self._q.get()

    def release():
        self._q.put(42)