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

如何停止Dask中运行的任务?分布式调度器下已启动任务终止方法

停止Dask中正在运行的任务(含分布式调度器cancel()无效的解决方案)

常规场景下的任务停止方法

如果是本地单机运行或者使用默认调度器,直接调用任务的cancel()方法基本就能搞定:

  • 单个任务取消:
    future = client.submit(my_task_function)
    future.cancel()
    
  • 批量取消多个任务:把所有要终止的future对象放进列表,传给client.cancel()就行:
    client.cancel(list_of_futures)
    

分布式调度器下cancel()无效时的应对方案

当任务已经在远程工作节点上启动执行,cancel()经常会因为任务已经进入执行阶段(比如正在占用硬件资源跑起来了)而失效,这时候可以试试下面几个更硬核的方法:

1. 精准终止任务所在的工作进程

每个任务都是跑在工作节点的某个进程里的,找到这个进程干掉它就行:

  • 先通过client.get_task_metadata(future)获取任务的元数据,里面会有任务所在的节点地址和进程ID(PID);
  • 登录到对应的远程节点,用系统命令终止进程:Linux/macOS用kill <PID>,Windows用taskkill /PID <PID> /F
  • 注意:这个操作会终止整个进程,该进程里的其他任务也会跟着挂掉,所以一定要确认好目标进程只跑了你要终止的任务。

2. 用client.revoke()强制终止

revoke()cancel()更激进,它不仅会把任务从队列里移除,还能强制终止正在运行的任务进程:

client.revoke(future, terminate=True)

这里的terminate=True是核心参数,它会直接杀掉任务所在的工作进程,确保任务彻底停止。

3. 重启工作节点(批量/单个)

如果上面的方法都不管用,那就重启节点:

  • 重启所有工作节点:用client.restart(),但这会终止所有正在运行的任务,适合需要彻底清理集群的场景;
  • 重启单个节点:可以通过Dask Dashboard(默认http://<调度器IP>:8787)找到目标节点,点击重启按钮,或者用集群的管理API操作,这样只会影响单个节点上的任务。

4. 通过Dask Dashboard手动操作

打开Dask的可视化Dashboard,在"Tasks"页面找到正在运行的目标任务,右键点击选择"Cancel"或者"Terminate"。可视化界面有时候比代码调用更直接,尤其是当代码层面的命令没生效的时候。

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

火山引擎 最新活动