Dask任务/作业排队



我已经使用Dask很长一段时间了,但我仍然不知道默认情况下是否有任务的队列系统。假设我们有一个本地集群和一个客户端:

from dask.distributed import Client, LocalCluster
cluster = LocalCluster()
cli = Client(cluster)

我想运行,不是并行的,而是一个任务接一个任务(提交后提交,或未来后提交(如下:

import time
a, b = cli.submit(time.sleep, 5), cli.submit(time.sleep, 1)

很容易看出,由于未来b在未来a之前完成,因此它们同时运行。我的问题是以下

  • 是否可以强制未来b在未来a完成之前不启动
  • 如果任务很重,我不希望所有任务都在同一时间运行,我想要一些队列系统。dask jobqueue是怎么回事?我没有可用的外部队列系统(slum等(
  • 或者Dask Scheduler是否以某种方式注意到,它不会因为同时安排太多任务而给工人带来太大负担

要使一个任务依赖于另一个任务,您有一些选项:

  • 在前一个任务完成之前不要启动任务,例如,使用.results属性等待任务。在这种情况下,Dask并没有为你做什么
  • 设置集群,将工作线程的数量限制在您认为可以同时轻松运行的任务数量,并为LocalCluster提供适当的参数(这是首选解决方案(
  • 具有明确地依赖于先前任务的任务

def sleepme(t, *args):
time.sleep(t)
print("done", t)
f1 = client.submit(sleepme, 5)
f2 = client.submit(sleepme, 1, f1)  # won't run until f1 is done

最新更新