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



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

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

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

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

您在此处所描述的内容完全正确且符合预期。请记住,Python将使用模块缓存,因此在使用新代码之前,您需要重新启动Python解释器。

问题是"为什么Celery不接受新版本",但这就是大多数库的工作方式。然而,Django开发服务器是个例外。它有特殊的代码,可以帮助它根据需要自动重新加载Python代码。它基本上是在不需要重新启动web服务器的情况下重新启动web server。

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

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

最新更新