我最近一直在玩 django 和 celery。开发过程中一件烦人的事情是,每次修改任务时我都必须重新启动 celery 守护进程。当我开发时,我通常喜欢使用“manage.py runserver”,它会在我的应用程序修改时自动重新加载 django 框架。
有没有办法在 runserver 执行的重新加载过程中添加一个钩子,以便它自动重新启动我正在运行的 celery 守护进程?
或者,芹菜是否有类似的监控和重新加载更改模式,我应该将其用于开发?
我最近一直在玩 django 和 celery。开发过程中一件烦人的事情是,每次修改任务时我都必须重新启动 celery 守护进程。当我开发时,我通常喜欢使用“manage.py runserver”,它会在我的应用程序修改时自动重新加载 django 框架。
有没有办法在 runserver 执行的重新加载过程中添加一个钩子,以便它自动重新启动我正在运行的 celery 守护进程?
或者,芹菜是否有类似的监控和重新加载更改模式,我应该将其用于开发?
Django-supervisor 非常适合这个目的。您可以让它启动 Django 服务器、Celery 和您需要的任何其他东西,并为开发和生产服务器提供不同的配置。它还知道在您的代码更改时重新加载 celery 守护进程。 https://github.com/rfk/django-supervisor
我相信你可以设置CELERY_ALWAYS_EAGER
为true
.
是的。Django 提供了自动重载钩子,可以用来重启其他脚本。
这是一个简单的管理命令,它在重新加载时打印一条消息
import subprocess
from django.core.management.base import BaseCommand
from django.utils import autoreload
def reload():
print('Code changed. Auto reloading...')
class Command(BaseCommand):
def handle(self, *args, **options):
autoreload.main(reload)
现在您可以保存到 reload.py 并使用python manage.py reload
. 此处提供了重新加载 celery 工人的管理命令。
Celery 没有任何重新加载代码或在代码更改时自动重新启动的功能,而您必须手动重新启动它。
没有办法添加钩子,我认为不值得编辑 django 的源代码只是为了执行重新启动。就我个人而言,在开发过程中,我更喜欢看到用颜色而不是原木尾部装饰的芹菜输出外壳,更具可读性。
Celery 2.5 有一个实验性的运行时选项 --autoreload 也可以用于此目的。以下是发行说明中的更多详细信息。话虽如此,我认为 django-supervisor (通过@Lee Semel)看起来是更好的做事方式。我想我会在这里发布这个替代方案,以防其他读者不想为异步处理配置另一个应用程序。