Flask中带有Redis后端的芹菜任务优先级

时间:2019-09-08 05:45:20

标签: flask celery

下面是我的简化网站应用程序和celery设置

app = Flask(__name__)
celery = Celery(__name__, broker='redis://localhost:6379/0') 
celery.conf.update({app.config})

和其他芹菜配置是

CELERYD_MAX_TASKS_PER_CHILD=1 
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT=['json','pickle']

我有两项任务,一项占用大量CPU和内存资源,并且需要很长时间才能完成(我想将其优先级设置为“低”),另一项只是发送电子邮件给帐户验证(我想将其优先级设置为“高”),定义如下,

@celery.task(serializer='pickle') 
def long_big_task_with_low_priority(...):
    ...   

@celery.task(serializer='pickle') 
def send_email_with_high_priority(...):
    ...

我使用监督者来执行芹菜

celery worker -A celerytaskfile.celery --loglevel=error --concurrency=2 --logfile=celerylogfile.log

因为第一个任务消耗了大量资源,所以在这里进行并发2。

我的问题是,当有两个第一任务正在运行时,现在celery接收到一个新任务以发送电子邮件,是否可以立即执行send-mail任务,然后在完成后继续执行第一个任务两个任务?

软件包版本:芹菜:4.1.0 redis == 2.10.6

1 个答案:

答案 0 :(得分:2)

您需要两名工人。一个将仅处理long_big_task_with_low_priority,其他将处理其他(快速运行)任务。为此,您将需要一个单独的队列来long_big_task_with_low_priority任务。

使用CELERY_TASK_ROUTES(对于较旧的celery版本使用CELERY_ROUTES)将慢速任务路由到新队列。

CELERY_TASK_ROUTES = {
    'long_big_task_with_low_priority': {'queue': "slow_queue"},
}

在运行工作程序时,分配队列(这两者都很重要,因为否则它们将消耗任何队列中的任务)

celery是默认的队列名称-默认情况下,所有任务都去那里:

celery worker -A celerytaskfile.celery --queues celery

第二个工人:

celery worker -A celerytaskfile.celery --queues slow_queue

http://docs.celeryproject.org/en/latest/userguide/configuration.html#task-routes https://docs.celeryproject.org/en/latest/userguide/workers.html#queues

相关问题