2017-04-25 208 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