Celery不能与RabbitMQ一起使用"--autoreload"选项

Ser*_*gey 5 python django rabbitmq celery django-celery

  1. 我不知道是bug还是配置问题.
  2. 目标:调试/修改Celery任务,而无需在每次进行小的更改时手动重新启动工作程序

所以我配置了Celery + RabbitMQ.一切正常.

添加--autoreloadcelery -A proj worker --loglevel=debug命令选项,并在此处停止记录:

[2014-09-11 19:22:00,447: DEBUG/MainProcess] | Worker: Hub.register Autoreloader...
Run Code Online (Sandbox Code Playgroud)

没有它:

[2014-09-11 19:37:34,316: DEBUG/MainProcess] | Worker: Hub.register Pool...
[2014-09-11 19:37:34,317: DEBUG/MainProcess] basic.qos: prefetch_count->16
[2014-09-11 19:37:36,275: DEBUG/MainProcess] pidbox received method enable_events() [reply_to:None ticket:None]
[2014-09-11 19:37:36,275: INFO/MainProcess] Events of group {task} enabled by remote.
Run Code Online (Sandbox Code Playgroud)

其他一切都很好.RabbitMQ之后收到一条消息

celery call tasks.update
Run Code Online (Sandbox Code Playgroud)

Celery酒店提供连接.它只是没有告诉Celery开始任务.

它看起来像一个连接问题,但我不知道它是什么.
如果你可以提供帮助,请写信.

Sae*_*eed 1

celery 在 celery/worker/autoreload.py 第 67 行有一个错误

此错误修复已提交给master:https://github.com/pashinin/celery/commit/92b52db6eeeb75494700ffe807ecd4c1fe6b0643

您可以通过更改 autoreload.py 的第 67 行来修补库

for chunk in iter(lambda: f.read(2 ** 20), ''):
Run Code Online (Sandbox Code Playgroud)

for chunk in iter(lambda: f.read(2 ** 20), b''):
Run Code Online (Sandbox Code Playgroud)

进行此更改后,您可能仍然面临一个问题:如果您已经创建了一个任务,则不会重新创建该任务,并且该任务在模块重新加载后也不会更新。重新加载的任务只有在您再次执行一次后才会激活。

Celery 开发者似乎并不愿意尽早解决这个问题。在那之前你有两个选择:

  1. 更新的任务需要在拾取新任务之前执行。

  2. 更新任务后重新启动 celery Worker