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

时间:2014-02-28 18:47:20

标签: python django rabbitmq celery django-celery

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

  1. 停止芹菜工人
  2. 停止RabbitMQ
  3. 重置RabbitMQ
  4. 启动RabbitMQ
  5. 将用户添加到RabbitMQ,我的Django应用程序已配置为使用
  6. 为此用户设置适当的权限
  7. 重启芹菜工作者
  8. 然而,这似乎是一种比我应该采取的更为激烈的方法。我可以使用更轻量级的方法吗?

1 个答案:

答案 0 :(得分:12)

  

我发现,当我处理我的开发代码时,Django   开发服务器知道如何自动检测代码何时   更改,然后重新启动服务器,以便我可以看到我的更改。然而,   我的应用程序的RabbitMQ / Celery部分没有接受这些类型   发展的变化。

您在此描述的内容完全正确且预期。请记住,Python将使用module cache,因此您需要重新启动Python解释器才能使用新代码。

问题是“为什么Celery没有拿到新版本”,但这就是大多数图书馆的工作方式。但是,Django开发服务器是个例外。它有特殊的代码,可以帮助它根据需要自动重新加载Python代码。 It basically restarts the web server without you needing to restart the web server

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

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