芹菜多个队列无法正常工作。所有任务都将发送到默认队列

时间:2017-09-22 22:09:10

标签: python python-2.7 flask celery

我正在使用带有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

所以,问题是所有任务都被发送到'默认'队列。任何帮助都非常感谢。谢谢!

1 个答案:

答案 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 - 尝试添加exchangeexchange_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)