后台点了取消,界面显示已撤销,任务日志里仍然继续输出了 12 分钟,最后还写入了结果。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,revoke 默认只对还没被取走的任务生效,正在执行的任务要 terminate 才会发信号。worker 收到信号后如果没处理,进程会等当前代码块跑完。

「任务取消未生效」这类改动最怕改一半,回滚脚本先准备好,再动生产。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

app.control.revoke(task_id, terminate=True, signal='SIGTERM')
celery -A app inspect revoked

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

具体做法是,取消时传 terminate=True 和 signal='SIGTERM';任务里在循环处检查取消标记 主动退出;把长循环拆成小段 每段检查一次;取消后核对状态和实际输出 确认没有再写库。

最后用这个标准收尾,取消后 10 秒内任务日志停止输出 状态变为 REVOKED 结果表里没有新记录。

作者 9823189