使用Dask的分布式调度程序时,我有一个在我想要停止的远程工作程序上运行的任务。
我该如何阻止它?我知道取消方法,但如果任务已经开始执行,这似乎不起作用。
答案 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)