簡體   English   中英

芹菜和路由

[英]Celery and routing

我需要在特定的celeryd實例上運行一些任務。 所以我配置了隊列:

celeryconfig.py:

CELERY_QUEUES = {
    'celery': {
        'exchange': 'celery',
        'binding_key': 'celery',
    },
    'import': {
        'exchange': 'import',
        'binding_key': 'import.products',
    },
}

CELERY_ROUTES = {
    'celery_tasks.import_tasks.test': {
        'queue': 'import',
        'routing_key': 'import.products',
    },
}

import_tasks.py:

@task
def test():
    print 'test'

@task(exchange='import', routing_key='import.products')
def test2
    print 'test2'

然后我開始芹菜:

celeryd -c 2 -l INFO -Q import

並嘗試執行該任務。 'test'執行但'test2'沒有執行。 但我不想在CELERY_ROUTES中指定每個導入任務。 如何在任務定義中指定哪個隊列應該執行任務?

請參閱Roman的解決方案 - http://www.imankulov.name/posts/celery-for-internal-api.html - 按名稱訪問任務,但也能夠指定隊列以及如何導入任務模塊。

哦,忘了說我已經使用了send_task函數來執行任務。 此功能不會導入任務。 它只是將任務的名稱發送到隊列。

所以不是這樣的:

from celery.execute import send_task

result = send_task(args.task, task_args, task_kwargs)

我寫:

from celery import current_app as celery_app, registry as celery_registry

celery_imports = celery_app.conf.get('CELERY_IMPORTS')
if celery_imports:
    for module in celery_imports:
        __import__(module)

task = celery_registry.tasks.get(args.task)
if task:
    result = task.apply_async(task_args, task_kwargs)

我找到了幾乎讓我滿意的解決方案:

class CustomRouter(object):
    def route_for_task(self, task, args=None, kwargs=None):
        if task.startswith('celery_tasks.import_tasks'):
            return {'exchange': 'import',
                    'routing_key': 'import.products'}

CELERY_ROUTES = (
    CustomRouter(),
)

問題是現在我不能使用名稱來完成任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM