celery 中如何停止子进程

2022-07-20 10:47:03 +08:00
 u2gign
app.control.revoke(task_id, terminate=True, signal="SIGKILL")

用上面的方法发现停止进程后,子进程并不会被杀掉。 难道需要收集所有子进程,然后在循环杀掉吗?不知道是否有更好的方法

2516 次点击
所在节点    Python
7 条回复
u2gign
2022-07-20 11:14:40 +08:00
prctl(PR_SET_PDEATHSIG, SIGKILL)
找到一个这个方法
hanssx
2022-07-20 12:55:58 +08:00
在 celery 中启用的子进程,最好要设置进程组 setpgrp ,kill 的时候会一块 kill 掉,比如 subprocess.Popen()这个所启用的,参考 https://www.jianshu.com/p/8e582146bd4c

另外可以发送 SIG_USR 信号,参考 https://stackoverflow.com/questions/8920643/cancel-an-already-executing-task-with-celery/29627549#29627549

再看一下这个 https://docs.celeryq.dev/en/latest/userguide/workers.html#worker-persistent-revokes

而且我这边之前测试 celery revoke 有一定机率会 kill celery worker 进程,感觉 celery 很多 bug 没修,现在不清楚了,后来换了 dramatiq
u2gign
2022-07-20 14:30:30 +08:00
@hanssx 非常感谢
among
2022-07-20 20:23:20 +08:00
@hanssx

dramatiq 用起来怎么样,现在用 celery ,是感觉到有很多问题。
hanssx
2022-07-20 22:14:19 +08:00
@among 不好意思,这块可能给不了啥意见,我只能说可以先弄个 Demo 试试,不要直接上生产,特性没 celery 多,但是足够我用而且没有遇到啥 BUG ,一年前用过一段时间,可能参考意义不大,我当时用的时候版本都偏低了,反正让我现在做项目选,我会先试 dramatiq 。
cpyS963ga8s46yV5
2022-07-22 16:42:58 +08:00
@hanssx 第三个链接,永久 revoke 有试过吗?设置 statedb 参数会不会让 task_id 一直增多然后在内存占用大,因为从说明来看是通过这个文件持久化,重启的时候加载进内存,但是并没有说这个文件存的是多长时间的 revoke 的 task 。
chioplkijhman
2022-07-29 13:28:41 +08:00
我的 ffmpeg 任务需要先 revoke ,再用 psutil kill 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/867471

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX