如何在队列空时自动终止celery工作进程?

6 投票
1 回答
2820 浏览
提问于 2025-04-18 15:30

有没有什么“干净”的方法可以在工作队列空了之后结束工作进程?

我的想法是,如果没有工作要做,就不需要让这些工作进程一直在监听队列。我试过自动缩放的选项,但根据我的经验,即使我把下限设置为0,工作进程也不会结束。

在我的情况下,我需要用celery从某个地方下载1000个文件。所以我把1000个任务放进了队列,但这就是我希望这一批工作进程完成的所有工作。如果它们能在下载完所有文件后自动结束,那就太理想了,而不是在那里闲着,直到我记得手动结束这些进程。

我没有找到任何关于如何在celery内部做到这一点的建议。有什么想法吗?谢谢!

1 个回答

0

使用非常好用的Rq简单任务队列系统时,你可以让它在“突发模式”下运行。也就是说,工作程序会启动,处理队列中的所有任务,然后结束。如果想处理更多任务,我们可以每分钟用Cron重新启动一次工作程序。

对于Celery,我们可以通过设置两个不同的Cron任务来实现类似的效果:

*/2 * * * * celery -A proj worker -l info

这个命令会在每个偶数分钟启动Celery。

1-59/2 * * * * ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill

在奇数分钟时,停止Celery工作程序。幸运的是:“当关闭被启动时,工作程序会在真正结束之前完成所有正在执行的任务”。

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

实际上,我会让Celery一直运行。一个等待空队列的单个进程几乎不会消耗任何资源。而且这样做会更灵活、更可靠。

撰写回答