如何在Dask中停止正在运行的任务?

时间:2018-03-09 22:26:34

标签: dask

使用Dask的分布式调度程序时,我有一个在我想要停止的远程工作程序上运行的任务。

我该如何阻止它?我知道取消方法,但如果任务已经开始执行,这似乎不起作用。

1 个答案:

答案 0 :(得分:5)

如果尚未运行

如果任务尚未开始运行,您可以通过取消相关的未来取消它

future = client.submit(func, *args)  # start task
future.cancel()                      # cancel task

如果您正在使用dask集合,那么您可以使用client.cancel方法

x = x.persist()   # start many tasks 
client.cancel(x)  # cancel all tasks

如果正在运行

但是,如果您的任务已经开始在worker中的某个线程上运行,那么您无法阻止该线程。不幸的是,这是Python的限制。

以明确的停止条件构建

您可以做的最好的事情是使用您自己的自定义逻辑在您的函数中构建某种停止标准。您可以考虑在循环中检查共享变量。寻找"变量"在这些文档中:http://dask.pydata.org/en/latest/futures.html

from dask.distributed import Client, Variable

client = Client()
stop = Varible()
stop.put(False)

def long_running_task():
    while not stop.get():
        ... do stuff

future = client.submit(long_running_task)

... wait a while

stop.put(True)