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

jmi*_*loy 5 python flask uwsgi flask-script

有没有一种方法(在uWSGI或Flask中)注册一个函数,以便在每个worker生成尽快运行?

我们有一个 Flask 应用程序,它可以从预加载一堆东西中受益。以下仅对preload8 个工作进程调用一次。第一个请求很快,但预加载的对象以某种方式共享,这会导致错误。

app = Flask(__name__)
preload()
Run Code Online (Sandbox Code Playgroud)

如果我使用before_first_request,那么对象会在每个工作进程中加载​​,并且不会出现错误,但第一个请求非常慢。

app = Flask(__name__)

@app.before_first_request
def bfr():
    preload()
Run Code Online (Sandbox Code Playgroud)

我还尝试设置一个烧瓶脚本。运行该命令可以工作,但显然对象是在命令的进程中加载​​的,而不是在 uwsgi 工作线程中加载的。

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

@manager.command
def preload():
    ...
Run Code Online (Sandbox Code Playgroud)

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

编辑:刚刚找到了 uswgi hook-post-fork选项(以及其他钩子选项)。明天我要尝试一下。也许其中之一就是我所需要的。

jmi*_*loy 6

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

import uwsgidecorators

@uwsgidecorators.postfork
def preload():
    ...
Run Code Online (Sandbox Code Playgroud)