7

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

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

或者,芹菜是否有类似的监控和重新加载更改模式,我应该将其用于开发?

4

5 回答 5

4

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

于 2011-06-27T14:28:04.130 回答
2

我相信你可以设置CELERY_ALWAYS_EAGERtrue.

于 2012-01-26T05:41:13.133 回答
2

是的。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 工人的管理命令。

于 2018-03-08T12:02:42.447 回答
1

Celery 没有任何重新加载代码或在代码更改时自动重新启动的功能,而您必须手动重新启动它。

没有办法添加钩子,我认为不值得编辑 django 的源代码只是为了执行重新启动。就我个人而言,在开发过程中,我更喜欢看到用颜色而不是原木尾部装饰的芹菜输出外壳,更具可读性。

于 2011-03-02T19:11:06.650 回答
1

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

于 2012-06-01T13:43:27.337 回答