django - 如何从节拍调度程序可用的池中排除工作人员?
问题描述
我有一个在 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 队列中的任务,
- 在应用程序 B 中调用的被调用任务队列中的任务由工作人员运行,
- 在应用程序 C 中调用的被调用任务队列中的任务将由调用任务工作人员运行。
但是上面的配置并没有发生。来自 cron_tasks 的任务仅由 worker 运行,但在应用 B 中调用的来自 called_tasks 的一些任务由 called_tasks_worker 运行。
我怎样才能让它工作?
解决方案
我有一个类似的用例,设置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.#",
),
)
推荐阅读
- python - 将嵌套字典转换为字符串
- thingsboard - 如何在 thingsboard MQTT 交换中获取当前时间
- javascript - 删除输入类型的值:文件
- vba - 将 html 结果页面定义为变量以从 php 页面中提取内容时访问 vba 炸弹
- python - 使用 pyenv 设置全局 python 版本没有按预期工作
- javascript - 如何从 Python、Javascript 连接到 UserContentManager“收到的脚本消息”?
- java - 排除特殊字符的正则表达式
- r - 如何在 R Markdown 中将图像插入表格
- ruby-on-rails - 如何使用 pdf-forms gem 用图像填充 PDF?
- html - 将 .pug 编译为 html 后加载外部 CSS