我正在使用带有Flask应用程序的Celery,这是我的配置:
app.config['CELERY_TASK_QUEUES'] = (
Queue('fast', Exchange('fast'), routing_key='fast'),
Queue('default', Exchange('default'), routing_key='default'),
Queue('processing', Exchange('processing'), routing_key='processing'),
)
app.config['CELERY_TASK_ROUTES'] = {
'app.tasks.extract_text': {'queue': 'processing', 'routing_key': 'processing'},
...
'app.tasks.vt_notifications': {'queue': 'default', 'routing_key': 'default'},
...
'app.tasks.update_files_from_search': {'queue': 'fast', 'routing_key': 'fast'},
...
}
app.config['CELERY_DEFAULT_QUEUE'] = 'default'
app.config['CELERY_DEFAULT_EXCHANGE'] = 'default'
app.config['CELERY_DEFAULT_ROUTING_KEY'] = 'default'
我最终运行了像这样的芹菜实例:
celery -A app.tasks.celery worker -Q 'processing' --concurrency 1 -l debug -n processing
celery -A app.tasks.celery worker -Q 'fast' --concurrency 1 -l debug -n fast
celery -A app.tasks.celery worker -Q 'default' --concurrency 1 -l debug -n default
所以,问题是所有任务都被发送到'默认'队列。任何帮助都非常感谢。谢谢!
答案 0 :(得分:3)
如果使用芹菜> 4,我会推荐一些东西:
首先,尝试添加name
您的任务(确保您在CELERY_TASK_ROUTES
中使用正确的名称。例如:
@app.task(name='extract_text'])
def extract_text(..):
pass
其次,尝试将CELERY_TASK_ROUTES
更改为:
CELERY_ROUTES = {
'extract_text': {
'exchange': 'processing',
'exchange_type': 'direct',
'routing_key': 'processing'
}
}
(而非queue
- 尝试添加exchange
和exchange_type
)。
最后,您不必使用它,只是为了调试,您可以在触发时显式路由任务:
(extract_text.signature(args=(...), queue='processing')).delay()
修改强>
您确定要根据需要使用配置吗?这是一个例子:
celery_app = Celery()
celeryconfig = {}
celeryconfig['BROKER_URL'] = 'amqp://'
celeryconfig['CELERY_RESULT_BACKEND'] = 'redis://localhost'
celeryconfig['CELERY_QUEUES'] = (
Queue('fast', Exchange('fast'), routing_key='fast'),
Queue('default', Exchange('default'), routing_key='default'),
Queue('processing', Exchange('processing'), routing_key='processing'),
)
celeryconfig['CELERY_ROUTES'] = {
'extract_text': {
'exchange': 'processing',
'exchange_type': 'direct',
'routing_key': 'processing'
}
}
celery_app.config_from_object(celeryconfig)