下面是我的简化网站应用程序和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
答案 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