首页 > 解决方案 > 如何从节拍调度程序可用的池中排除工作人员?

问题描述

我有一个在 Heroku 上运行的 Django 应用程序,有几个生产实例(应用程序的不同版本,使用不同的环境变量运行)。

我将 Celery 与 Redis 和 CloudAMQP 一起使用。

我的 Procfile 的内容:

release: python manage.py migrate
web: gunicorn {appname}.wsgi
worker: celery -A {appname} --concurrency=3 worker
beat: celery -A {appname} beat

节拍仅在应用程序 A 中使用。只有应用程序 B 当前正在使用工作人员(这些测功机仅在那些特定应用程序中使用)。

我要做的是启动一个应用程序 C。它需要一个工作人员来运行代码中调用的任务,但该工作人员不能用于运行计划任务——它们都应该从应用程序 A 运行。

据我了解,beat 使用可用池中的任何免费工作人员。有没有办法将应用 C 中提供的工作人员排除在 beat 使用的工作人员之外?


编辑: 我阅读了一些文档,但我仍然无法完成这项工作。

我的 Django 项目中有几个应用程序具有 tasks.py 文件,其中包含指定的任务。我划分了文件,以便在任何单个文件中只有一种类型的任务(定期运行或从代码调用)。在我的 celery.py 文件中:

app.conf.task_routes = {
    'communication.tasks.*': {'queue': 'called_tasks'},
    'reservations.tasks.*': {'queue': 'cron_tasks'}
}

我的 Procfile 现在是:

release: python manage.py migrate
web: gunicorn {appname}.wsgi
worker: celery -A {appname} --concurrency=3 worker -Q cron_tasks,called_tasks
called_tasks_worker: celery -A {appname} --concurrency=3 worker -Q called_tasks
beat: celery -A {appname} beat

我在应用程序 A 中运行了一个节拍测功机,在应用程序 B 中运行了一个工作人员测功机,在应用程序 C 中运行了一个调用任务工作人员。所有这些应用程序都使用相同的 CloudAMOP 和 Redis(每个应用程序都有一个附加组件)随附的)。

我想看到的是:

但是上面的配置并没有发生。来自 cron_tasks 的任务仅由 worker 运行,但在应用 B 中调用的来自 called_tasks 的一些任务由 called_tasks_worker 运行。

我怎样才能让它工作?

标签: djangoherokucelery

解决方案


我有一个类似的用例,设置app.conf.task_routes也没有帮助。

这是您应该做的:

from kombu import Queue

app.conf.task_queues = (
    Queue(
        "called_tasks",
        routing_key="communication.tasks.#",
    ),
    Queue(
        "cron_tasks",
        routing_key="reservations.tasks.#",
    ),
)

推荐阅读