2013-04-04 47 views
12

在我的網站中,用戶可以每次更新他們的配置文件(手動),或每天自動運行一次。芹菜 - 需要優先運行的任務

此任務正在與芹菜現在分發。

但我有一個「問題」:

每天

,自動更新,工作把所有用戶(+ -6k用戶)隊列:

from celery import group 
from tasks import * 
import datetime 
from lastActivityDate.models import UserActivity 

today = datetime.datetime.today() 
one_day = datetime.timedelta(days=5) 
today -= one_day 

print datetime.datetime.today() 

user_list = UserActivity.objects.filter(last_activity_date__gte=today) 
g = group(update_user_profile.s(i.user.auth.username) for i in user_list) 

print datetime.datetime.today() 
print g(user_list.count()).get() 

如果有人嘗試做手動更新,他們將進入隊列並永遠持續執行。

有沒有一種方法可以設置此手動任務以最佳方式運行? 或專門爲每個分隔的隊列:手動和自動?

+0

您可以限制執行的任務數量,例如以小時爲單位。然後另一項任務...閱讀他們的文檔... – catherine 2013-04-04 11:56:09

回答

25

芹菜不支持任務優先級。 (V3.0)

http://docs.celeryproject.org/en/master/faq.html#does-celery-support-task-priorities

您可以通過路由任務解決這個問題。

http://docs.celeryproject.org/en/latest/userguide/routing.html

準備默認和priority_high隊列。

CELERY_DEFAULT_QUEUE = 'default' 
CELERY_QUEUES = (
    Queue('default'), 
    Queue('priority_high'), 
) 

運行兩個守護進程。

[email protected]:/$ celery worker -Q priority_high 
[email protected]:/$ celery worker -Q default,priority_high 

和路由任務。

your_task.apply_async(args=['...'], queue='priority_high') 
+2

對於任何人來這個答案遲到(像我一樣);需要注意的是,兩個芹菜工都在不同的主機上運行 - 也就是說,兩臺服務器正在使用priority_high隊列,一臺服務器正在使用默認 – mafrosis 2015-02-01 05:01:30

+0

@Satoshi Yoshinaga我還可以通過指定「-c N」來實現隊列特定的併發性,守護進程運行命令中的參數?我需要我的一個隊列中只有一些工人,而其他很多(繁重任務隊列)。 – 2015-05-18 05:58:40

+1

現在您還可以使用[消息優先級](http://docs.celeryproject.org/en/latest/whatsnew-3.0.html#redis-priority-support) – Chemary 2016-10-26 17:47:32