【问题标题】:Is there a way to run initialization code in each uwsgi worker (after forking)有没有办法在每个 uwsgi 工作者中运行初始化代码(分叉后)
【发布时间】:2019-03-20 18:57:12
【问题描述】:

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

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

app = Flask(__name__)
preload()

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

app = Flask(__name__)

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

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

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

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

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

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

【问题讨论】:

  • 你是在使用 celery 还是一些 worker 来处理后台任务?

标签: python flask uwsgi flask-script


【解决方案1】:

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

import uwsgidecorators

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

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 2010-12-22
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2018-01-13
    • 1970-01-01
    相关资源
    最近更新 更多