Celery任务子进程填满并发插槽?

时间:2014-06-17 14:59:49

标签: python django concurrency subprocess celery

我正在使用CELERYD_CONCURRENCY = 4在队列中运行一系列长时间运行的重量级Celery任务(产生多个子进程)。最初,它们应该启动4个任务。但是,随着任务的完成,没有任何新任务开始,直到更多完成,很快Celery将活动任务的数量保持在1或2,直到所有任务完成(由Celery Flower确认)。

当我只运行默认的Celery add函数之类的简单任务时,一切都按预期工作。

Celery任务启动的子进程(具有与任务相同的进程组ID)是否计入填充并发插槽?有没有办法确保Celery只统计任务本身?

1 个答案:

答案 0 :(得分:2)

Celery使用prefork作为默认执行池,每次生成子进程(另一个fork)时,它都会计算运行的并发进程数,即CELERYD_CONCURRENCY中的数字。

避免这种情况的方法是使用eventlet,这样您就可以在每项任务上产生多个异步调用,只要您的任务没有阻止任何调用,例如{{ 1}}。

为了进一步优化,您可以尝试将使用subprocess.communicate的任务拆分为一个不同的队列,该队列中有一个使用prefork的worker,以及其他所有不使用eventlet阻塞的worker。