芹菜任务优先

Eng*_*amp 7 python celery

我想用Celery管理任务.我希望拥有一个任务队列(并发1),并能够将任务推送到具有不同优先级的队列,以便更高优先级的任务将抢占其他任务.

我将三个任务添加到队列中,如下所示:

add_tasks.py

from tasks import example_task

example_task.apply_async((1), priority=1)
example_task.apply_async((2), priority=3)
example_task.apply_async((3), priority=2)
Run Code Online (Sandbox Code Playgroud)

我有以下配置:

tasks.py

from __future__ import absolute_import, unicode_literals
from celery import Celery
from kombu import Queue, Exchange
import time

app = Celery('tasks', backend='rpc://', broker='pyamqp://')

app.conf.task_queues = [Queue('celery', Exchange('celery'), routing_key='celery', queue_arguments={'x-max-priority': 10})]


@app.task
def example_task(task_num):
    time.sleep(3)
    print('Started {}'.format(task_num)
    return True
Run Code Online (Sandbox Code Playgroud)

我希望我添加的第二个任务在第三个任务之前运行,因为它具有更高的优先级,但它没有.他们按照增加的顺序运行.

我正在关注文档并认为我已正确配置了应用程序.

我做错了什么,还是我误解了优先功能?

Vij*_*hya 5

队列有可能没有机会对消息进行优先级排序(因为它们在排序发生之前就被下载了).尝试使用这两个设置(根据需要适应您的项目):

CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1
Run Code Online (Sandbox Code Playgroud)

预取乘数默认为4.

我开发了一个示例应用程序来实现Celery在很小范围内的优先级任务.请看这里.在开发它时,我遇到了一个非常类似的问题,这种设置的变化实际上解决了它.

请注意,您还需要RabbitMQ版本3.5.0或更高版本.

  • @EngineerCamp 我的 RabbitMQ 版本是“3.5.7”。_请查看 [RabbitMQ 网站](https://www.rabbitmq.com/priority.html) 和 [Celery FAQ 页面](http://docs.celeryproject.org/en/latest/faq.html#does -celery-support-task-priorities),你会注意到你需要 3.5.0 或更高版本来实现优先级队列。_如果不是这样,那么请告诉我:) (2认同)