Tin*_*ino 6 python django celery celeryd
我需要将某个django站点实例的所有任务路由到某个队列.我的设置如下:
DJANGO_SETTINGS_MODULE不同的CELERY_DEFAULT_QUEUE设置运行.在"芹菜服务器"上,我通过主管(简化conf)运行多个工作器实例:
[program:production_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.production
command=/pth/to/python celery -A website.celery worker --events --queues myserver --loglevel WARNING --concurrency 4 -n production@celery.myserver.nl
[program:staging_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.staging
command=/pth/to/python celery -A website.celery worker --events --queues myserver_staging --loglevel WARNING --concurrency 1 -n staging@celery.myserver.nl
[program:development_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.development
command=/pth/to/python celery -A website.celery worker --events --queues myserver_development --loglevel INFO --concurrency 1 -n development@celery.myserver.nl
Run Code Online (Sandbox Code Playgroud)
这有效,检查:
$ celery -A website.celery inspect activeues
-> production@celery.myserver.nl: OK
* {u'exclusive': False, u'name': u'myserver', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}
-> staging@celery.myserver.nl: OK
* {u'exclusive': False, u'name': u'myserver_staging', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}
-> development@celery.myserver.nl: OK
* {u'exclusive': False, u'name': u'myserver_development', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}
Run Code Online (Sandbox Code Playgroud)
(名称符合CELERY_DEFAULT_QUEUE设置)
website/celery.py 包含基础知识(跳过导入):
app = Celery('proj')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
Run Code Online (Sandbox Code Playgroud)
因此,我希望通过开发设置运行的Web服务器生成的任务最终只能在development_queue,等等.但是,我看到任务正在由不同的队列或所有三个队列处理,这是有问题的.
我的期望是错误的,因为这将是分离这些任务的好方法吗?关于路由的所有文档都是关于将不同的任务路由到不同的队列,这是我不需要的.我需要将某个站点(环境)的所有任务路由到某个队列.我可以做些什么来分离这些环境?
我在这里得到了 Celery 开发者的答案:https://github.com/celery/celery/issues/2508,即:
您必须设置所有
CELERY_DEFAULT_QUEUE、CELERY_DEFAULT_EXCHANGE和CELERY_DEFAULT_ROUTING_KEY。否则,您最终将得到三个队列,它们都绑定到相同的交换和路由键。或者使用此处的方法来显式设置它: http://docs.celeryproject.org/en/latest/userguide/routing.html#change-the-name-of-the-default-queue
这样可行!
| 归档时间: |
|
| 查看次数: |
2726 次 |
| 最近记录: |