gpt4 book ai didi

Django 和 Celery - 更改后将代码重新加载到 Celery 中

转载 作者:行者123 更新时间:2023-12-03 12:07:43 25 4
gpt4 key购买 nike

如果我在 celery 运行时对 tasks.py 进行更改,是否有一种机制可以重新加载更新后的代码?或者我必须关闭 celery 重新加载?

我读到 celery 有一个 --autoreload旧版本中的参数,但我在当前版本中找不到它:
celery: error: unrecognized arguments: --autoreload

最佳答案

不幸的是--autoreload不起作用,它是 deprecated .

您可以使用 Watchdog,它为 watchmedo 提供了一个 shell 实用程序来根据文件事件执行操作。

pip install watchdog

你可以开始工作
watchmedo auto-restart -- celery worker -l info -A foo

默认情况下,它将监视当前目录中的所有文件。这些可以通过传递相应的参数来改变。
watchmedo auto-restart -d . -p '*.py' -- celery worker -l info -A foo

添加 -R递归观看文件的选项。

如果您正在使用 django 并且不想依赖看门狗,那么有一个简单的技巧可以实现这一点。 Django 具有 autoreload 实用程序,runserver 使用该实用程序在代码更改时重新启动 WSGI 服务器。

相同的功能可用于重新加载 celery worker 。创建一个名为 celery 的单独管理命令。编写一个函数来杀死现有的 worker 并启动一个新的 worker 。现在钩住这个函数来自动重新加载,如下所示。对于 Django >= 2.2
import sys

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


class Command(BaseCommand):
def handle(self, *args, **options):
autoreload.run_with_reloader(self._restart_celery)

@classmethod
def _restart_celery(cls):
if sys.platform == "win32":
cls.run('taskkill /f /t /im celery.exe')
cls.run('celery -A phoenix worker --loglevel=info --pool=solo')
else: # probably ok for linux2, cygwin and darwin. Not sure about os2, os2emx, riscos and atheos
cls.run('pkill celery')
cls.run('celery worker -l info -A foo')

@staticmethod
def run(cmd):
subprocess.call(shlex.split(cmd))

对于 Django < 2.2
import sys

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


class Command(BaseCommand):
def handle(self, *args, **options):
autoreload.main(self._restart_celery)

@classmethod
def _restart_celery(cls):
if sys.platform == "win32":
cls.run('taskkill /f /t /im celery.exe')
cls.run('celery -A phoenix worker --loglevel=info --pool=solo')
else: # probably ok for linux2, cygwin and darwin. Not sure about os2, os2emx, riscos and atheos
cls.run('pkill celery')
cls.run('celery worker -l info -A foo')

@staticmethod
def run(cmd):
subprocess.call(shlex.split(cmd))

现在你可以用 python manage.py celery 运行 celery worker当代码库更改时将自动重新加载。

这仅用于开发目的,请勿在生产中使用。

关于Django 和 Celery - 更改后将代码重新加载到 Celery 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43919166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com