web-dev-qa-db-ja.com

セロリ-優先的に実行する必要があるタスク

私のウェブサイトでは、ユーザーはいつでもプロファイル(手動)を更新することも、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()

誰かが手動更新を行おうとすると、キューに入り、永久に実行されます。

この手動タスクを優先的に実行するように設定する方法はありますか?または、分離されたキューごとに専用にします:手動と自動?

16
fabriciols

Celeryはタスクの優先度をサポートしていません。 (v3.0)

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

タスクをルーティングすることで、この問題を解決できます。

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

Defaultおよびpriority_highキューを準備します。

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

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

user@x:/$ celery worker -Q priority_high
user@y:/$ celery worker -Q default,priority_high

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

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