有没有办法在每个 uwsgi worker 中 运行 初始化代码(分叉后)

Is there a way to run initialization code in each uwsgi worker (after forking)

有没有办法(在 uWSGI 或 Flask 中)在每个 worker 产卵后尽快注册一个函数 运行?

我们有一个 flask 应用程序,它受益于预加载一堆东西。下面只为8个worker进程调用一次preload。第一个请求很快,但预加载的对象以导致错误的某种方式共享。

app = Flask(__name__)
preload()

如果我使用before_first_request,那么对象在每个工作进程中加载​​并且没有错误,但是第一个请求很慢。

app = Flask(__name__)

@app.before_first_request
def bfr():
    preload()

我也试过设置一个烧瓶脚本。 运行 命令有效,但显然对象是在命令的进程中加载​​的,而不是 uwsgi workers。

app = Flask(__name__)
manager = Manager(app)

@manager.command
def preload():
    ...

我想如果我们使用before_first_request,我们可以在重启uwsgi后手动触发一个请求。这是这里唯一的解决方案吗?

编辑:刚找到 uswgi hook-post-fork 选项(和其他挂钩选项)。我明天要试试。也许其中之一就是我需要的。

postfork 装饰器为我工作,只是花了一点时间才找到。

import uwsgidecorators

@uwsgidecorators.postfork
def preload():
    ...