我有一个运行在Heroku上的Django应用程序,它有几个生产实例(该应用程序的不同版本,使用不同的env变量运行(。
我正在将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在使用工作者(这些dynos只在那些特定的应用程序中使用(。
我想做的是启动一个应用程序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
我有一个beat dyno在应用程序A中运行,一个worker dyno在程序B中运行,还有一个called_tasks worker在应用程序C中运行。所有这些应用程序都使用相同的CloudAMOP和Redis(每个应用程序都有一个附加组件,附带所有这些应用(。
我想看到的是:
worker运行的cron_tasks队列中的- 任务
- 来自应用程序B中调用的要由工作者运行的called_tasks队列的任务
- 要由called_tasks_worker运行的应用程序C中调用的called_ttasks队列中的任务
但以上配置不会发生这种情况。cron_Tasks中的任务仅由worker运行,但应用程序B中调用的called_Tasks的一些任务由called_ttasks_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.#",
),
)