Django,RabbitMQ和Celery - 为什么Celery在开发中更新我的Django代码后会运行旧版本的任务?

jon*_*omo 9 python django rabbitmq celery django-celery

所以我有一个Django应用程序偶尔会向Celery发送任务以进行异步执行.我发现,当我在开发中处理我的代码时,Django开发服务器知道如何自动检测代码何时更改,然后重新启动服务器以便我可以看到我的更改.但是,我的应用程序的RabbitMQ/Celery部分没有了解开发中的这些变化.如果我更改稍后将在Celery任务中运行的代码,Celery仍将继续运行旧版本的代码.我能够接受改变的唯一方法是:

  1. 停止芹菜工人
  2. 停止RabbitMQ
  3. 重置RabbitMQ
  4. 启动RabbitMQ
  5. 将用户添加到我的Django应用程序配置使用的RabbitMQ
  6. 为此用户设置适当的权限
  7. 重启芹菜工人

然而,这似乎是一种比我应该采取的更为激烈的方法.我可以使用更轻量级的方法吗?

Mar*_*eth 12

我发现,当我在开发中处理我的代码时,Django开发服务器知道如何自动检测代码何时更改,然后重新启动服务器以便我可以看到我的更改.但是,我的应用程序的RabbitMQ/Celery部分没有了解开发中的这些变化.

你在这里描述的是完全正确和预期的.请记住,Python将使用模块缓存,因此您需要在使用新代码之前重新启动Python解释器.

问题是"为什么Celery没有拿到新版本",但这就是大多数图书馆的工作方式.但是,Django开发服务器是个例外.它有特殊的代码,可以帮助它根据需要自动重新加载Python代码.它基本上重新启动Web服务器,而无需重新启动Web服务器.

请注意,当您在生产中运行Django时,您可能必须重新启动/重新加载您的服务器(因为您不会在生产中使用开发服务器,并且大多数生产服务器不会尝试解决实施问题的麻烦检测文件更改和自动重新加载服务器的功能).

最后,您不需要重新启动RabbitMQ.您只需重新启动Celery工作程序即可使用新版本的Python代码.但是,如果新版本的代码正在更改消息中的数据,则可能必须清除队列.例如,当Celery工作程序期望接收版本2时,它可能正在接收消息的版本1.

  • 抱歉,我有同样的问题。我通过“/etc/init.d/celeryd restart”重新启动工作程序。大多数情况下,它有效。但有时不会,即使我重新启动服务器。 (2认同)