celery - 需要优先运行的任务

Posted

技术标签:

【中文标题】celery - 需要优先运行的任务【英文标题】:celery - Tasks that need to run in priority 【发布时间】:2013-03-26 10:40:44 【问题描述】:

在我的网站中,用户可以随时更新他们的个人资料(手动),或者每天自动更新一次。

这个任务现在正在用 celery 分发。

但我有一个“问题”:

每天,在自动更新中,一项作业将所有用户(+-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()

如果有人尝试手动更新,他们将进入队列并永远执行。

有没有办法将此手动任务设置为优先运行? 还是为每个单独的队列做一个专用的:手动和自动?

【问题讨论】:

您可以限制执行的任务数,例如以小时为单位。然后是另一个任务...阅读他们的文档... 【参考方案1】:

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 队列。

from kombu import Queue
CELERY_DEFAULT_QUEUE = 'default'
CELERY_QUEUES = (
    Queue('default'),
    Queue('priority_high'),
)

运行两个守护进程。

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

还有路由任务。

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

【讨论】:

对于迟到这个答案的人(比如我);重要的是要注意这两个 celery worker 运行在不同的主机上 - 即,两台服务器正在从 priority_high 队列中消费,而一台服务器正在使用默认值 实际链接 - docs.celeryproject.org/en/latest/userguide/… 致任何遇到此答案的人。队列来自kombu包而不是队列包 对于那些迟到的人来说,Celery 现在在不同程度上支持 RabbitMQ 和 Redis 的任务优先级 为什么在上面的任务路由设置示例中将高优先级队列设置为高优先级?它由比默认队列更多的工作人员提供服务的事实?我问的原因是我只有一台主机来运行一个或多个芹菜工人,我想优先处理一些快速任务,但我不知道该怎么做。【参考方案2】:

如果您使用 RabbitMQ 传输,请按以下方式配置队列: settings.py

from kombu import Queue
...
CELERY_TASK_QUEUES = (
    Queue('default', routing_key='task_default.#', max_priority=10), 
    ...)

然后运行你的任务:

my_low_prio_task.apply_async(args=(...), priority=1)
my_high_prio_task.apply_async(args=(...), priority=10)

目前此代码适用于kombu==4.6.11、celery==4.4.6。

【讨论】:

正确答案。对于其他想知道的人,10 是最高优先级,1 是最低优先级。

以上是关于celery - 需要优先运行的任务的主要内容,如果未能解决你的问题,请参考以下文章

Celery 和 Django 的定期任务

仅在单击按钮时运行 celery 任务

创建 celery 任务然后同步运行

celery(异步处理)+redis

记一次celery使用过成中丢失上下文问题

在没有工人的情况下运行 celery 任务