我是芹菜和redis的新手.
我通过使用启动了我的redis服务器redis-server
.
使用此参数运行Celery
celery -A proj worker
Run Code Online (Sandbox Code Playgroud)
没有其他配置.但是,我意识到当我在芹菜中长时间运行时,它不会处理队列中的另一个任务,直到长时间运行的任务完成.我的理解是,由于我的CPU上有8个核心,我应该能够同时处理8个任务,因为默认参数-c
是核心数量?
我错过了什么吗?
你的问题很经典,每个人都遇到了这个有长期任务的人.
根本原因是芹菜试图优化您的执行流程,为每个工人保留一些任务.但如果其中一项任务长期运行,其他任务就会被锁定.它被称为'预取计数'.这是因为默认情况下芹菜设置为短任务.
另一个相关的设置是'迟到的'.默认情况下,worker从队列中获取任务并立即发送'acknowledge'信号,然后代理从队列中删除此任务.但这意味着将为此工作人员预取更多消息.'late ack'enabled表示只有在任务完成后才能发送确认.
这只是两个字.您可以阅读有关预取和晚期确认的更多信息.
至于解决方案 - 只需使用这些设置(celery 4.x):
task_acks_late = True
worker_prefetch_multiplier = 1
Run Code Online (Sandbox Code Playgroud)
或以前的版本(2.x - 3.x):
CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1
Run Code Online (Sandbox Code Playgroud)
此外,使用参数启动worker -0fair
也是一样的.
归档时间: |
|
查看次数: |
1996 次 |
最近记录: |