我是芹菜和雷迪斯的新手。
我使用redis-server
启动了Redis服务器。
使用此参数运行芹菜
celery -A proj worker
没有其他配置。但是,我意识到,当我在芹菜中的运行时间很长时,它不会处理在长期运行的任务完成之前在队列中的另一个任务。我的理解是,由于我的CPU上有8个内核,因此我应该能够同时处理8个任务,因为-c
的默认参数是核心的数量?
我在这里错过了什么吗?
您的问题是经典的,每个人都遇到了长期运行的任务。
根本原因是芹菜试图优化您的执行流量为每个工人保留某些任务。但是,如果这些任务之一是长期运行的,那么其他任务就会被锁定。它被称为"预取数"。这是因为默认情况下为短任务设置了芹菜。
另一个相关的设置是"晚期ACK"。默认情况下,工人从队列中执行任务,并立即发送"确认"信号,然后经纪人从队列中删除此任务。但这意味着将为该工人提供更多消息。"迟到的ACK"启用了该任务完成后才告诉Worker仅在完成确认。
这只是两个词。您可能会阅读有关预摘要和晚期Ack的更多信息。
至于解决方案 - 只需使用这些设置(芹菜4.x):
task_acks_late = True
worker_prefetch_multiplier = 1
或以前的版本(2.x -3.x):
CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1
另外,使用参数-Ofair
启动工人也相同。