You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Dask显式停止由dask-scheduler调度的运行中任务?

显式停止Dask正在运行的任务指南

嘿,这个需求很常见!在Dask里要随时叫停由scheduler调度、在worker上跑的任务,有几个实用的显式方法,我给你一一说明:

1. 用client.cancel()取消单个/多个Future

这是最直接的方式——如果你在提交任务时保留了Future对象,直接把它传给client.cancel()就行。举个例子:

from dask.distributed import Client

# 连接到你的scheduler
client = Client("tcp://your-scheduler-ip:8786")

# 提交任务并保存Future引用
running_task = client.submit(your_custom_task, arg1, arg2)

# 当需要停止时,执行取消
client.cancel(running_task)

如果是一堆任务,比如一个Future列表,直接传列表就能批量取消:client.cancel([future1, future2, future3])。这个操作会通知scheduler停止调度该任务,同时让正在执行它的worker立刻中断任务。

2. 通过任务键取消(没保留Future时用)

要是你没保存Future对象,也能通过任务的唯一键来取消。每个Dask任务都有一个专属key,你可以通过client.who_has()或者查看scheduler的UI(默认端口8787)找到目标任务的key,然后执行:

client.cancel("your-task-unique-key")

这个方法适合你找不到Future引用,但能定位到任务键的场景。

3. 取消整个工作流/集合

如果你的任务是Dask集合(比如dask.arraydask.dataframe)或者有依赖的工作流,直接取消整个集合就能递归终止所有关联的未完成任务:

# 假设df是一个dask.dataframe对象
client.cancel(df)

这样不用一个个去取消单个任务,非常高效。

一些关键提醒

  • 中断及时性:Worker收到取消指令后会尽快停止任务,但如果任务在执行无法中断的代码(比如C扩展里的阻塞操作),可能得等这个操作结束才能停下。
  • 已完成任务不生效cancel()只对正在运行或等待调度的任务有用,已经完成的任务不会被回滚。
  • 资源自动释放:取消任务后,Worker会自动释放该任务占用的CPU、内存等资源,不用手动清理。

内容的提问来源于stack exchange,提问作者TheCodeCache

火山引擎 最新活动