django的runserver选项是否提供了运行其他重启脚本的钩子?

时间:2011-03-01 17:05:59

标签: django celery django-celery

我最近一直在玩django和芹菜。开发过程中一件烦人的事情就是我每次修改任务时都必须重启celery守护进程。当我正在开发时,我通常喜欢使用'manage.py runserver',它会在修改我的应用程序时自动重新加载django框架。

有没有办法在runserver执行的重新加载过程中添加一个钩子,以便它自动重启我运行的celery守护进程?

或者,芹菜是否有类似的监视和重载加载模式,我应该用于开发?

5 个答案:

答案 0 :(得分:4)

Django-supervisor非常适合这个目的。您可以让它启动Django服务器,Celery以及您需要的任何其他东西,并为开发和生产服务器提供不同的配置。它还知道在代码更改时重新加载celery守护程序。 https://github.com/rfk/django-supervisor

答案 1 :(得分:2)

我相信您可以将CELERY_ALWAYS_EAGER设置为true

答案 2 :(得分:1)

Celery在代码更改时没有任何重装代码或自动重启功能,而不必手动重启。

没有添加钩子的方法,我认为编辑django的源代码只是为了执行重启而不值得。 就个人而言,我正在开发中,我更愿意看到芹菜的输出外壳用颜色而不是尾部装饰日志,更具可读性。

答案 3 :(得分:1)

Celery 2.5具有实验性运行时选项--autoreload,也可用于此目的。以下是release notes中的更多详细信息。话虽如此,我认为django-supervisor(来自@Lee Semel)看起来更像是做事的方式。我想我会在这里发布这个替代方案,以防其他读者不想为异步处理配置另一个应用程序。

答案 4 :(得分:1)

是。 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运行它。对reload celery workers is available here的管理命令。