Gunicorn 动态反映更改的代码

Cod*_*rji 5 django gunicorn

我正在开发一个 django Web 应用程序,用户可以在应用程序本身中使用ace 编辑器通过 UI 修改某些类的代码(可以将其视为 gitlab/github,您可以在其中在线更改代码)。但这些课程在某个时候是由 django 和 celery 工人运行的。

保存代码更改后,由于gunicorn,django 不会选择这些更改,但由于其过程不同,所以与 celery 一起工作正常。(使用本地运行它runserver工作正常,并且 django 和 celery 都会选择更改)。

有没有办法让gunicorn反映包含类的某些目录的更改,而无需重新加载整个应用程序?如果需要重新加载,有没有办法在不停机的情况下,一一重新加载gunicorn的worker?

枪械命令:

/usr/local/bin/gunicorn config.wsgi --bind 0.0.0.0:5000 --chdir=/app
Run Code Online (Sandbox Code Playgroud)

wsgi配置文件:

import os
import sys

from django.core.wsgi import get_wsgi_application

app_path = os.path.abspath(os.path.join(
    os.path.dirname(os.path.abspath(__file__)), os.pardir))
sys.path.append(os.path.join(app_path, 'an_application'))

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")

application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)

Cod*_*rji 0

我能够通过将 python 脚本的扩展名更改为任何内容来解决这个问题.py

然后我使用以下函数加载这些文件:

from importlib import util
from immportlib.machinary import SourceFileLoader

def load_module(module_name, modele_path):
    module_path = path.join(path.dirname(__file__),  "/path/to/your/files{}.anyextension".format(module_name))
    spec = util.spec_from_loader(module_name,
                                 SourceFileLoader(module_name, module_path))
    module = util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Gunicorn 不会将它们加载到 RAM 中,我能够动态应用更改,而无需 applyevalexecfunctiong。