2017-04-25 165 views
6

我想用芹菜管理任务。我想要一个任务队列(并发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) 

我有以下配置:

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 

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

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

我做错了什么或者我误解了优先级功能?

回答

4

有可能是队列没有机会优先消息(因为它们在排序之前得到下载)。与这两个设置尝试(根据需要适应您的项目):

CELERY_ACKS_LATE = True 
CELERYD_PREFETCH_MULTIPLIER = 1 

预取倍数为4默认。

我开发了一个示例应用程序来实现Celery在很小规模上的优先级任务。请看看它here。在开发它的过程中,我遇到了一个非常类似的问题,这种设置变化实际上解决了它。

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

+0

感谢您的回答。我下载了你的项目并按照你所描述的设置完全按照记录运行它,但仍然没有看到优先行为的工作。 – EngineerCamp

+0

@EngineerCamp我再次克隆后重新检查,它似乎工作正常。 有一个小预览视频[这里](https://www.youtube.com/watch?v=nQXO2kjGV9M&feature=youtu.be)只有一个芹菜工人,这样就很容易观察排序的任务。 在视频开始时(_视频转码为360p_时),**观察720p如何在点击480p和720p时获得更高优先级,即使首先点击480p时也是如此。 –

+0

我又给了它,但仍然没有运气。我正在使用Python 3,并在Ubuntu 14.04上,所以也许有一些差异。 – EngineerCamp