是否有用于运行 Celery worker 的 Django manage.py 命令?

问题描述

我创建了一个简短的 Python 脚本来启动当前 Django 的 Celery 工作线程:

from celery.bin import worker

worker.worker(app=my_app).run()

这很好用,并且使用了所有正确的设置,因此无需指定 celery 的无数命令行参数(我可以通过 debugpy 启动它并从容器远程调试它在 VS 代码中)。

我的问题是是否可以运行 manage.py 命令来实现相同的目的?

(注意:使用 Celery 4.3 和 Django 2.2)

解决方法

应用程序可以使用 manage.py 注册自己的操作。例如,您可能想要为正在分发的 Django 应用添加 manage.py 操作。

为此,向应用程序添加管理/命令目录。 Django 将为该目录中名称不以下划线开头的每个 Python 模块注册一个 manage.py 命令。例如:

YOUR_APP/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            runcelery.py
    tests.py
    views.py

在此示例中,runcelery 命令将可用于在 INSTALLED_APPS 中包含 YOUR_APP 应用程序的任何项目。

runcelery.py 模块只有一个要求——它必须定义一个类 Command 来扩展 BaseCommand 或其子类之一。

要实现该命令,请编辑 YOUR_APP/management/commands/runcelery.py 如下所示:

from django.core.management.base import BaseCommand,CommandError
from celery.bin import worker

class Command(BaseCommand):
    help = 'Run celery worker'

    def handle(self,*args,**options):
        worker.worker(app=my_app).run()

您现在可以像这样从 ma​​nage.py 运行它:python manage.py runcelery

查看此 article 了解更多信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...