芹菜自动重新加载任何更改

新手上路,请多包涵

当模块在 CELERY_IMPORTSsettings.py 中发生变化时,我可以让芹菜自动重新加载。

我试图让母模块检测子模块的变化,但它没有检测到子模块的变化。这让我明白检测不是由芹菜递归完成的。我在文档中搜索了它,但没有遇到任何针对我的问题的回复。

将项目中所有与芹菜相关的部分添加到 CELERY_IMPORTS 以检测更改,这真的让我很困扰。

有没有办法告诉芹菜“当项目的任何地方发生任何变化时自动重新加载自己”。

谢谢你!

原文由 Ahmet DAL 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 510
2 个回答

您可以使用 -I|--include 手动包含其他模块。将其与 GNU 工具结合使用,例如 findawk ,您将能够找到所有 .py 文件并包含它们

$ celery -A app worker --autoreload --include=$(find . -name "*.py" -type f | awk '{sub("\./",""); gsub("/", "."); sub(".py",""); print}' ORS=',' | sed 's/.$//')

让我们解释一下:

 find . -name "*.py" -type f

find 递归搜索包含 .py 的所有文件。输出看起来像这样:

 ./app.py
./some_package/foopy
./some_package/bar.py

然后:

 awk '{sub("\./",""); gsub("/", "."); sub(".py",""); print}' ORS=','

此行将 find 的输出作为输入,并删除所有出现的 ./ 。然后它将所有 / 替换为 . 。最后一个 sub() 删除替换 .py 为空字符串。 ORS 将所有换行符替换为 , 。这输出:

 app,some_package.foo,some_package.bar,

最后一个命令 sed 删除最后一个 ,

所以正在执行的命令看起来像:

 $ celery -A app worker --autoreload --include=app,some_package.foo,some_package.bar

如果您的源代码中有 virtualenv ,您可以通过添加 -path .path_to_your_env -prune -o 来排除它:

 $ celery -A app worker --autoreload --include=$(find . -path .path_to_your_env -prune -o -name "*.py" -type f | awk '{sub("\./",""); gsub("/", "."); sub(".py",""); print}' ORS=',' | sed 's/.$//')

原文由 OrangeTux 发布,翻译遵循 CC BY-SA 3.0 许可协议

Celery --autoreload 不起作用,已 弃用

由于您使用的是 django,因此您可以为此编写一个管理命令。 Django 具有 autoreload 实用程序,runserver 使用该实用程序在代码更改时重新启动 WSGI 服务器。

相同的功能可用于重新加载芹菜工人。创建一个名为 celery 的单独管理命令。编写一个函数来杀死现有的 worker 并启动一个新的 worker。现在将此函数挂接到 autoreload,如下所示。

 import shlex
import subprocess

from django.core.management.base import BaseCommand
from django.utils import autoreload

def restart_celery():
    cmd = 'pkill celery'
    subprocess.call(shlex.split(cmd))
    cmd = 'celery worker -l info -A foo'
    subprocess.call(shlex.split(cmd))

class Command(BaseCommand):

    def handle(self, *args, **options):
        print('Starting celery worker with autoreload...')

        # For Django>=2.2
        autoreload.run_with_reloader(restart_celery)

        # For django<2.1
        # autoreload.main(restart_celery)

现在您可以使用 python manage.py celery 运行 celery worker — 它会在代码库更改时自动重新加载。

这仅用于开发目的,请勿在生产中使用。代码取自我 在此处的其他答案

原文由 Chillar Anand 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题