【问题标题】:Django, RabbitMQ, & Celery - why does Celery run old versions of my tasks after I update my Django code in development?Django、RabbitMQ 和 Celery - 为什么在我更新开发中的 Django 代码后,Celery 会运行旧版本的任务?
【发布时间】:2014-02-28 18:47:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: python django rabbitmq celery django-celery


    【解决方案1】:

    我发现当我在开发中处理我的代码时,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 worker 可能正在接收版本 1 的消息,而它期望接收版本 2。

    【讨论】:

    • 对不起,我有同样的问题。我通过/etc/init.d/celeryd restart 重新启动worker。大多数情况下,它有效。但有时不会,即使我重新启动服务器。
    猜你喜欢
    • 2011-07-18
    • 2011-07-17
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多