我很擅长使用distributed
python库。我有4名工人,我已成功为每个工人使用14个核心(在16个可用的核心中)启动了一些并行运行,导致4 * 14 = 56个并行运行的任务。
但是如果我想在每个工人中同时只做一个任务,那该怎么办呢。通过这种方式,我期望一个任务在工作者上并行使用14个核心。
答案 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。