[英]Dask Distributed - how to run one task per worker, making that task running on all cores available into the worker?
我是使用distributed
python库的新手。 我有4名工人,我已成功为每个工人使用14个核心(在16个可用的核心中)启动了一些并行运行,导致4 * 14 = 56个并行运行的任务。
但是如果我想在每个工人中同时只做一个任务,那该怎么办呢。 通过这种方式,我期望一个任务在工作者上并行使用14个核心。
Dask worker维护一个用于启动任务的线程池。 每个任务始终使用此池中的一个线程。 您无法告诉任务从此池中获取多个线程。
但是,还有其他方法可以控制和限制dask worker中的并发性。 在您的情况下,您可以考虑定义工作者资源 。 这可以让你阻止许多大任务同时在同一个工人上运行。
在下面的示例中,我们定义每个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})
下面是一个示例,当您希望在python而不是命令行中启动worker时分配资源约束:
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.