Celery Worker 如何运行任务中其他地方定义的代码?

ple*_*unt 5 python django message-queue celery django-celery

我尝试阅读官方文档以及其他 SO 线程,但仍然不清楚 Celery 是如何工作的。

据我了解:

  1. Django 应用程序:Celery 安装在 Django(或任何应用程序)中,其中@shared_task装饰器函数定义要执行的工作。
  2. 消息代理:消息代理从 1. 获取此任务并将其排队。
  3. Celery Worker:一个完全独立的 Celery Worker 接收任务并运行它。该工作人员甚至可以位于完全不同的机器中,只要它可以访问消息代理即可。

那么,最紧迫的问题是:

Celery Worker如何获取@shared_task中定义的代码来运行任务?

基本上,如果 3. 仅使用消息代理进行连接,如何获取 1. 中定义的内容?python 代码是否以字符串形式存储在消息代理中?消息代理项目/记录的数据结构是什么?

ple*_*unt 5

在花了一些时间并实际实施 Celery 之后,我能够弄清楚到底发生了什么。这可能是我自己的学习方式的一个缺点,或者文档忽略了它,无论哪种方式,我想把它留在这里,以防其他人也有同样的疑问。

在我看来,以下内容完全不明显:

  1. Django 应用程序:Celery 任务在此处定义。它已安装 Celery 作为依赖项。

  2. 消息代理:消息代理从 1. 获取此任务并将其排队。

  3. Celery Worker:这实际上不是一个仅包含 Celery 的单独的 python 应用程序。这是1.. 的完整实例。因此,您启动 Django两次,一次是生成任务,另一次是处理任务。两者都包含相同的@shared_task功能。

文档应解释的注意事项:

  • 如果您更新主 Django 应用程序并且不重新启动 Celery Worker,则您的 Worker 正在处理该@shared_task函数的过时版本。
  • 1. 中的应用程序是使用 Gunicorn(或任何您想要的)启动的,但 3. 中的应用程序是使用celery -A "your_app" workers -l INFO. 它没有运行 Gunicorn,但仍然包含 1 中的所有代码。

我认为在介绍 Celery 时,他们应该立即解释生产者和工作实例都包含您的源代码。