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

标签 python django rabbitmq celery django-celery

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

  1. 停止 celery worker
  2. 停止 RabbitMQ
  3. 重置 RabbitMQ
  4. 启动 RabbitMQ
  5. 将用户添加到我的 Django 应用配置为使用的 RabbitMQ
  6. 为此用户设置适当的权限
  7. 重启 Celery worker

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

最佳答案

I've found that as I work on my code in development, the Django development server knows how to automatically detect when code has changed and then restart the server so I can see my changes. However, the RabbitMQ/Celery section of my app doesn't pick up on these sorts of changes in development.

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

问题是“为什么 Celery 不选择新版本”,但这是大多数库的工作方式。然而,Django 开发服务器是个异常(exception)。它有特殊的代码,可以帮助它在必要时自动重新加载 Python 代码。 It basically restarts the web server without you needing to restart the web server .

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

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

关于python - Django、RabbitMQ 和 Celery - 为什么在我更新开发中的 Django 代码后 Celery 运行我的任务的旧版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22103401/

相关文章:

python - 如何将 tf.contrib 转换为 Tensorflow 2.0

python - Python 中的对象回滚、写时复制、版本化代理等

python - Django URL、模板、模型和 View 的命名约定

RabbitMQ - 奇怪的disk_free

java - RabbitMQ 消息在消费时不会出队

python - 将回归线添加到 shap.dependence_plot

python - 访问 GEKKO 最优解中的特定值

django - 如何将两个带注释的查询集合并为一个结果

mysql - 在 Django ORM 中选择中间行

python - Pika/RabbitMQ 连接问题 - 运行 VMWare CentOS 6.3