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

2024-04-07

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

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

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


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

您在这里所描述的完全正确且符合预期。请记住,Python 将使用模块缓存 http://docs.python.org/3.4/reference/import.html#the-module-cache,因此您需要重新启动 Python 解释器才能使用新代码。

问题是“为什么 Celery 不选择新版本”,但这就是大多数库的工作方式。然而,Django 开发服务器是一个例外。它具有特殊的代码,可以帮助它根据需要自动重新加载 Python 代码。它基本上会重新启动 Web 服务器,而无需重新启动 Web 服务器 https://docs.djangoproject.com/en/dev/ref/django-admin/#django-admin-runserver.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐