app.control.revoke(task_id, terminate=True, signal="SIGKILL")
用上面的方法发现停止进程后,子进程并不会被杀掉。 难道需要收集所有子进程,然后在循环杀掉吗?不知道是否有更好的方法
1
u2gign OP prctl(PR_SET_PDEATHSIG, SIGKILL)
找到一个这个方法 |
2
hanssx 2022-07-20 12:55:58 +08:00 1
在 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 |
5
hanssx 2022-07-20 22:14:19 +08:00
@among 不好意思,这块可能给不了啥意见,我只能说可以先弄个 Demo 试试,不要直接上生产,特性没 celery 多,但是足够我用而且没有遇到啥 BUG ,一年前用过一段时间,可能参考意义不大,我当时用的时候版本都偏低了,反正让我现在做项目选,我会先试 dramatiq 。
|
6
cpyS963ga8s46yV5 2022-07-22 16:42:58 +08:00
@hanssx 第三个链接,永久 revoke 有试过吗?设置 statedb 参数会不会让 task_id 一直增多然后在内存占用大,因为从说明来看是通过这个文件持久化,重启的时候加载进内存,但是并没有说这个文件存的是多长时间的 revoke 的 task 。
|
7
chioplkijhman 2022-07-29 13:28:41 +08:00
我的 ffmpeg 任务需要先 revoke ,再用 psutil kill 。
|