当他们听的队列变空时,如何自动杀死芹菜工人?

Cla*_*ara 6 python process worker celery

一旦他们一直在监听的队列变空,是否有任何"干净"的方法来杀死工作进程?

我的想法是,如果他们没有任何工作要做,我不需要让工人不断地听队列.我尝试了自动缩放选项,但根据我的经验,即使我将下限阈值设置为0,工作人员也不会死亡.

在我的情况下,我需要使用芹菜从某个地方下载1000个文件.所以我把1000个任务放在队列中,但这就是我希望这批工人做的所有工作.如果他们在完成下载所有文件之后以某种方式死亡,那将是理想的,并且在我记得手动杀死进程之前不会闲置.

我找不到任何关于如何从芹菜中做到这一点的建议.任何的想法?谢谢!

joh*_*all 0

使用非常好的Rq 简单作业队列系统,您可以在“突发模式”下运行它。工作线程将启动,开始处理队列中的所有作业,然后终止。为了处理更多作业,我们使用 Cron 每隔一分钟左右再次启动工作程序。

对于 Celery,我们可以通过使用两个单独的 Cron 作业来完成相同的操作:

*/2 * * * * celery -A proj worker -l 信息

这会每隔偶数分钟启动一次 Celery。

1-59/2 * * * * ps auxww | 1-59/2 * * * * grep '芹菜工人' | awk '{print $2}' | xargs 杀死

在奇数分钟,停止Celery 工人。对我们来说幸运的是:“当启动关闭时,工作线程将在实际终止之前完成所有当前正在执行的任务”。

上述组合意味着 Celery 只运行大约 50% 的时间。经过一些调整,它可以缩小到 5% 左右。

在实践中,我只是让 Celery 一直运行。等待空队列的单个进程几乎不会消耗任何资源。它也更加灵敏和可靠。