我在为Django配置Celery时遇到问题。
这就是我开始django-celery的方式:
python manage.py celery worker --autoscale=10,2
任务示例:
@task
def test(i):
print "ITERATION {} START".format(i)
time.sleep(10)
print "ITERATION {} END".format(i)
return True
我将此任务称为:
for i in range(10):
test.delay(i)
我期望发生的是,如果我将10个任务发送到队列,则应该打开10个进程 - 每个任务一个。
实际发生的是进程的随机数量,通常是4和在这4项任务完成后,另外3次开始,完成后,另外3次开始。甚至对于需要更长时间才能完成的任务,例如, 2分钟。
有人可以解释这种行为吗?如果自动缩放上限允许,我该如何立即启动所有任务?
此外,虽然自动缩放的下限为2,但启动服务器时,会运行3个进程。那是为什么?
平台:OpenWRT,双核处理器,2GB RAM。
答案 0 :(得分:0)
Celery默认情况下会为每个核心创建一个worker,所以我假设你在一个拥有4个核心的机器上运行。您可以使用标记--concurrency
进行配置,请参阅documentation以获取更多详细信息。
之后你说3个进程开始然后是2个,依此类推,任务只会在另一个进程完成时启动,并且由于预取策略,有时也会延迟。您可以查看this thread了解详情。
Celery启动主进程和X工作程序 - 主进程管理工作程序,在需要时重新启动它们并将任务分派给工作程序。因此,如果您有2名工人 - 您将有3个流程。