2013-04-04 16 views
12

私のウェブサイトのユーザーは、毎回自分のプロファイル(マニュアル)を更新したり、1日に1回自動更新したりすることができます。セロリ - 優先度で実行する必要のあるタスク

このタスクは現在セロリと共に配布されています。

毎日は、自動更新では、ジョブがキュー上のすべてのユーザー(+ -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

答えて

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'), 
) 

2つのデーモンを実行します。

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

タスクをルーティングします。

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

遅く(私のような)この答えに来る人のために。 2つのセールスワーカーが異なるホストで動作していることに注意することが重要です。つまり、2台のサーバーがpriority_highキューから消費していて、1台のサーバーがデフォルトを消費しています。 – mafrosis

+0

@ Yoshinaga佐々木さん「-c N」を指定することで、コマンドを実行するデーモンのparam?私は私の待ち行列の1つにいくつかの労働者しか持たない、そして他の多くのもの(重いタスクキュー)が必要です。 –

+1

[メッセージの優先度](http://docs.celeryproject.org/en/latest/whatsnew-3.0.html#redis-priority-support) – Chemary

関連する問題