django - 如何使用 Celery 和 Django 将任务路由到不同的队列

标签 django python-3.x celery python-3.6 django-celery

我正在使用以下堆栈:

  • Python 3.6
  • Celery v4.2.1 (代理: RabbitMQ v3.6.0 )
  • Django v2.0.4 .

  • 根据 Celery's documentation ,在不同的队列上运行计划任务应该就像在上为任务定义相应的队列一样简单。 CELERY_ROUTES ,尽管如此,所有任务似乎都在 Celery 的默认队列上执行。

    这是上的配置my_app/settings.py :
    CELERY_BROKER_URL = "amqp://guest:guest@localhost:5672//"
    CELERY_ROUTES = {
     'app1.tasks.*': {'queue': 'queue1'},
     'app2.tasks.*': {'queue': 'queue2'},
    }
    CELERY_BEAT_SCHEDULE = {
        'app1_test': {
            'task': 'app1.tasks.app1_test',
            'schedule': 15,
        },
        'app2_test': {
            'task': 'app2.tasks.app2_test',
            'schedule': 15,
        },
    
    }
    

    这些任务只是用于测试路由的简单脚本:

    文件 app1/tasks.py :
    from my_app.celery import app
    import time
    
    
    @app.task()
    def app1_test():
        print('I am app1_test task!')
        time.sleep(10)
    

    文件 app2/tasks.py :
    from my_app.celery import app
    import time
    
    
    @app.task()
    def app2_test():
        print('I am app2_test task!')
        time.sleep(10)
    

    当我使用所有必需的队列运行 Celery 时:
    celery -A my_app worker -B -l info -Q celery,queue1,queue2
    

    RabbitMQ 将显示只有默认队列“ celery ”正在运行任务:
    sudo rabbitmqctl list_queues
    # Tasks executed by each queue:
    #  - celery 2
    #  - queue1 0
    #  - queue2 0
    

    有人知道如何解决这种意外行为吗?

    问候,

    最佳答案

    我已经让它工作了,这里有几件事需要注意:
    根据 Celery's 4.2.0 documentation , CELERY_ROUTES应该是定义队列路由的变量,但它只适用于我使用 CELERY_TASK_ROUTES反而。任务路由似乎独立于 Celery Beat,因此这仅适用于手动安排的任务:

    app1_test.delay()
    app2_test.delay()
    
    或者
    app1_test.apply_async()
    app2_test.apply_async()
    
    为了让它与 Celery Beat 一起工作,我们只需要在 CELERY_BEAT_SCHEDULE 中明确定义队列。多变的。文件的最终设置my_app/settings.py如下:
    CELERY_BROKER_URL = "amqp://guest:guest@localhost:5672//"
    CELERY_TASK_ROUTES = {
     'app1.tasks.*': {'queue': 'queue1'},
     'app2.tasks.*': {'queue': 'queue2'},
    }
    CELERY_BEAT_SCHEDULE = {
        'app1_test': {
            'task': 'app1.tasks.app1_test',
            'schedule': 15,
            'options': {'queue': 'queue1'}
        },
        'app2_test': {
            'task': 'app2.tasks.app2_test',
            'schedule': 15,
            'options': {'queue': 'queue2'}
        },
    
    }
    
    我希望这可以为其他开发人员节省一些时间。

    关于django - 如何使用 Celery 和 Django 将任务路由到不同的队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51631455/

    相关文章:

    python - 获取文件中所有用户定义的类

    python - 调整大小不会影响 PyQt5 中的布局

    Python 3 操作系统.urandom

    python - 选择一定范围的数组元素并定义一个新数组

    python - 多台机器上的 Celery 任务

    javascript - 如何使用 Django 显示日志

    Amazon AWS 上的 Django + Celery - 使用单独的 EC2 实例作为工作线程

    python - Celery 正确的任务组链

    python - Django REST Swagger HTTPS 请求

    python - 在 Flask 中运行后台 Celery 任务