【问题标题】:celery task routing with CELERY_ROUTES not working with task subclasses带有 CELERY_ROUTES 的芹菜任务路由不适用于任务子类
【发布时间】:2014-07-17 16:25:33
【问题描述】:

我使用的是 celery 3.0.20,我很难让 celery 任务与不同的队列一起工作。

我的 celery worker 使用队列配置启动

-Q:w1 default -Q:w2 longrunning

Django 设置包含以下 celery 配置:

CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default'),
    Queue('longrunning', Exchange('longrunning'), routing_key='longrunning'),
)
CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE_TYPE = 'direct'
CELERY_DEFAULT_ROUTING_KEY = 'default'

CELERY_ROUTES = ({'mytasks.task_a.run': {
                    'queue': 'longrunning',
                    'routing_key': 'longrunning'
             }},

到目前为止,一切都很好。所有任务默认进入default队列,task_a进入长时间运行队列。

task_a模块实现如下:

from celery import task

@task
def run():
    # do some task work

现在,我遇到了一个问题,即一个不同的任务被实现为一个继承自 celery.Task 的类:

from celery import Task

class AnotherTask(Task):

    def run(self, *args, **kwargs):
        # do some task work

AnotherTask 类现在驻留在task_b 模块中时,我无法让这个任务在longrunning 队列中执行:我尝试将它添加到CELERY_ROUTES 中,但它们都不起作用:

{'mytasks.task_b': {
    'queue': 'longrunning',
     'routing_key': 'longrunning'
}}

-

{'mytasks.task_b.AnotherTask': {
    'queue': 'longrunning',
     'routing_key': 'longrunning'
}}

-

{'mytasks.task_b.AnotherTask.run': {
    'queue': 'longrunning',
     'routing_key': 'longrunning'
}}

我也尝试切换到默认交换类型'topic',但这也没有用。

任何提示如何让AnotherTask 类中的任务在longrunning 队列中执行?

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    好的,我找到了问题。

    这是因为所有其他任务都在longrunning 队列中结束,该队列定期以 celerybeat 开始。新任务是从 Web 环境启动的。并且celerybeat设置导入了包含CELERY_ROUTESdict的设置,web环境设置没有。啊!

    【讨论】:

      猜你喜欢
      • 2013-05-13
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 2016-04-24
      • 1970-01-01
      • 2019-02-26
      相关资源
      最近更新 更多