Celery工作进程未消耗足够任务

4 投票
1 回答
3451 浏览
提问于 2025-04-18 08:26

我遇到了一个关于Celery的奇怪问题。

我使用RabbitMQ作为消息中间件和结果存储。

任务是通过pickle进行序列化的,但它们只在数据库中获得一个文件的ID。它们获取这个ID,进行一些处理,然后把结果写回数据库。我只是把这个ID存储在结果存储中。

我使用一个组来提供任务,并且没有在其中运行任何子任务。

我有一个工作进程,设置了并发数为8(预先分叉)。

当我启动任务时,所有8个进程都在工作(CPU使用率达到100%)。

但是在第一个任务完成后,奇怪的情况就开始了。进程没有开始新的任务。任务被初始化了(我设置了CELERYD_MAX_TASKS_PER_CHILD=1),但运行方法没有被调用。

所以问题是,并不是所有的进程一直在工作。

我尝试了很多配置设置,但没有改变这种情况。

你有什么想法吗?

问题不是出在数据库等地方。我是在本地运行消息中间件和数据库的。还用flower查看了工作进程,发现大部分时间大约有4个进程在活动。其他任务被保留,但没有启动。

希望你能帮我!

1 个回答

13

最后我搞明白了:

其实只是我在启动工作进程时需要加的一个选项。

用 -Ofair 这个选项启动工作进程就解决了问题!

详情请看这里: http://docs.celeryproject.org/en/latest/userguide/optimizing.html#prefork-pool-prefetch-settings

谢谢你的帮助 :)

撰写回答