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