有没有一种方法可以在每个uwsgi worker中运行初始化代码(分叉之后)

时间:2019-03-20 18:57:12

标签: python flask uwsgi flask-script

是否有一种方法(在uWSGI或Flask中)注册在生成器后尽快在每个工作器中运行的功能?

我们有一个flask应用程序,它可以从预加载大量内容中受益。以下仅对8个工作进程调用preload。第一个请求很快,但是预加载的对象以某种方式共享,这会导致错误。

app = Flask(__name__)
preload()

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

app = Flask(__name__)

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

我还尝试设置了flask脚本。运行命令是可行的,但是显然对象是在命令的进程中而不是uwsgi工作者加载的。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

import uwsgidecorators

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