【问题标题】:Celery task not received by worker when two projects两个项目时工人没有收到芹菜任务
【发布时间】:2017-05-10 09:29:26
【问题描述】:

我的同事已经编写了 celery 任务,在设置文件中进行了必要的配置,还有主管的配置文件。一切正常。项目已移交给我,但我发现了一些我必须解决的问题。

有两个项目在一台机器上运行,两个项目几乎相同,我们称它们为projAprojB

supervisord.conf 文件如下:

;for projA
[program:celeryd]
directory=/path_to_projA/
command=celery -A project worker -l info
...

[program:celerybeat]
directory=/path_to_projA/
command=celery -A project beat -l info
...

; For projB
[program:celerydB]
directory=/path_to_projB/
command=celery -A project worker -l info
...

[program:celerybeatB]
directory=/path_to_projB/
command=celery -A project beat -l info
...

问题是,我正在通过循环创建任务,并且只从projAceleryd 接收到一个任务,并且没有收到剩余的任务(或者可以由projBceleryd 接收) .

但是当我停止 projB 的 celery 程序时,一切正常。 请注意, django-app 的实际名称是 project 因此 celery -A project worker/beat -l info。

请裸露,我是芹菜新手,感谢您的帮助。 TIA。

【问题讨论】:

  • 您是否对两个项目使用相同的代理?看起来这就是这里的问题。尝试为两者使用单独的代理。
  • 请提供您的 celery 设置。

标签: python django celery supervisord


【解决方案1】:

正如 Celery 文档所说,

Celery 是一个基于分布式消息传递的异步任务队列/作业队列。

当多个任务通过循环创建时,任务被平均分配给两个不同的工人,即projA的工人和projB的工人,因为你的工人是相同的。

如果项目相似或您提到的几乎相同,您可以使用Celery Queue,但当然您跨项目的队列应该不同。 提供了相同的 Celery Docs here

你需要设置CELERY_DEFAULT_QUEUECELERY_DEFAULT_ROUTING_KEYCELERY_QUEUES 在您的 settings.py 文件中。

您的supervisor.conf 文件需要所有程序的命令行中的队列名称。

例如:command=celery -A project beat -l info -Q <queue_name>

根据我的经验,这应该可行。

【讨论】:

  • 谢谢,我确实最终使用了队列,但没有更新问题。我的错。但答案与我使用的相似。
猜你喜欢
  • 2019-08-01
  • 2016-09-12
  • 2021-02-21
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
相关资源
最近更新 更多