Dask Distributed - 如何为每个工作人员运行一个任务,使该任务在所有可用的核心上运行?

时间:2017-07-12 08:36:16

标签: python distributed core worker dask

我很擅长使用distributed python库。我有4名工人,我已成功为每个工人使用14个核心(在16个可用的核心中)启动了一些并行运行,导致4 * 14 = 56个并行运行的任务。

但是如果我想在每个工人中同时只做一个任务,那该怎么办呢。通过这种方式,我期望一个任务在工作者上并行使用14个核心。

2 个答案:

答案 0 :(得分:2)

Dask worker维护一个用于启动任务的线程池。每个任务始终使用此池中的一个线程。您无法告诉任务从该池中获取多个线程。

但是,还有其他方法可以控制和限制dask worker中的并发性。在您的情况下,您可以考虑定义worker resources。这可以让你阻止许多大任务同时在同一个工人身上运行。

在下面的示例中,我们定义每个worker有一个Foo资源,每个任务需要运行一个Foo。这将阻止任何两个任务在同一个worker上同时运行。

dask-worker scheduler-address:8786 --resources Foo=1
dask-worker scheduler-address:8786 --resources Foo=1

from dask.distributed import Client
client = Client('scheduler-address:8786')
futures = client.map(my_expensive_function, ..., resources={'Foo': 1})

答案 1 :(得分:0)

这里是一个示例,当您希望在python中而不是在命令行中启动工作程序时希望分配资源约束:

from dask.distributed import Client
from dask import delayed
import time
import os

client_with_foo = Client(processes = False,
    n_workers= 2,
    threads_per_worker=10,
    resources = {'foo':1}
               )

@delayed
def do_work(cmd=None, interval=2):
    time.sleep(interval)
    return None


task_graph = []
for i in range(10):
    task_graph.append(do_work())

start = time.time()
result = client_with_foo.compute(task_graph, resources = {'foo':1})
output = client_with_foo.gather(result)
end = time.time()
print(end - start)

在两个工作人员中分配的10个2秒任务需要10秒才能执行,因此上述代码的输出大约为10。