私のウェブサイトでは、ユーザーはいつでもプロファイル(手動)を更新することも、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()
誰かが手動更新を行おうとすると、キューに入り、永久に実行されます。
この手動タスクを優先的に実行するように設定する方法はありますか?または、分離されたキューごとに専用にします:手動と自動?
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')