Python Dask作业队列设计模式?

Python Dask作业队列设计模式?,python,dask,job-queue,Python,Dask,Job Queue,假设我有一个简单的昂贵函数,它将一些结果存储到文件中: def costly_function(filename): time.sleep(10) with open('filename', 'w') as f: f.write("I am done!) 现在让我们假设我想在dask中安排一些这样的任务,然后它异步地接受这些请求并逐个运行这些函数。我正在设置dask客户端对象 cluster = dask.distributed.LocalCluster(n_w

假设我有一个简单的昂贵函数,它将一些结果存储到文件中:

def costly_function(filename):
    time.sleep(10)
    with open('filename', 'w') as f:
        f.write("I am done!)
现在让我们假设我想在dask中安排一些这样的任务,然后它异步地接受这些请求并逐个运行这些函数。我正在设置dask客户端对象

cluster = dask.distributed.LocalCluster(n_workers=1, processes=False)  # my attempt at sequential job processing
client = dask.distributed.Client(cluster)
。。。然后以交互方式(从IPython)安排这些作业:

>>> client.schedule(costly_function, "result1.txt")
>>> client.schedule(costly_function, "result2.txt")
>>> client.schedule(costly_function, "result3.txt")
我遇到的问题是,这些任务不是连续运行的,而是在parralel中运行的,在我的特殊情况下,这会导致并发问题


因此,我的问题是:设置我在dask中描述的工作队列的正确方法是什么?

好的,我想我可能有一个解决方案(尽管可以随意想出更好的解决方案!)。它需要稍微修改以前的昂贵功能:

def costly_function(filename, prev_job=None):
    time.sleep(10)
    with open('filename', 'w') as f:
        f.write("I am done!")

cluster = dask.distributed.LocalCluster(n_workers=1, processes=False)  # my attempt at sequential job processing
client = dask.distributed.Client(cluster)
然后在交互式上下文中,您将编写以下内容:

>>> future = client.submit(costly_function, "result1.txt")
>>> future = client.submit(costly_function, "result2.txt", prev_job=future)
>>> future = client.submit(costly_function, "result3.txt", prev_job=future)

我把你的答案修改了一点。您不需要调用
.result
。这是自动完成的。另外,方法名是submit,而不是schedule。嘿,谢谢你的编辑!您能解释一下为什么在这种情况下不需要调用.result()吗?我不知道这到底是如何自动完成的。当您在提交调用中包含future作为参数时,Dask将其标识为数据依赖项。在运行新任务之前,它会等待未来完成计算,并传入计算结果,而不是未来。您可以在以下网址了解更多关于Dask期货的信息: