【问题标题】:How gunicorn and shared variables workgunicorn 和共享变量如何工作
【发布时间】:2017-02-08 20:16:59
【问题描述】:

我有一个在请求中实例化的类(它是一个 ML 模型,在启动时会加载并需要一些时间进行配置)。这个想法是只做一次,让每个请求都使用模型进行预测。 gunicorn 每次都会实例化应用吗?

也就是说,每次有新请求进来时,模型都会重新训练吗?

【问题讨论】:

  • 你可以将它存储在全局应用程序中,或者将其腌制并放入redis中
  • 等等,为什么不直接导入训练好的模型呢?我很困惑...

标签: python flask gunicorn


【解决方案1】:

对于那些正在寻找如何在不使用 RedisSession 的情况下在 gunicorn 工作人员之间共享变量的人来说,这里是一个不错的选择,@987654321 @
其原理是从文件中读取和写入共享变量,这可以使用open() 完成,但 dotenv 在这种情况下是完美的。

  1. pip install python-dotenv

  2. 在 app 目录下,创建 .env 文件:
    ├── .env
    └── app.py
    .env:

    var1="值1" var2="value2"

    app.py:#flask 应用

from flask import Flask
import os
from dotenv import load_dotenv

app = Flask( __name__ )

# define the path explicitly if not in same folder
#env_path = os.path.dirname(os.path.realpath(__file__)) +'/../.env'
#load_dotenv(dotenv_path=env_path)    # you may need a first load


def getdotenv(env):
    try:
        #global env_path
        #load_dotenv(dotenv_path=env_path,override=True)
        load_dotenv(override=True)
        val = os.getenv(env)
        return val
    except :
        return None

def setdotenv(key, value):  # string
    global env_path
    if key :
        if not value:
            value = '\'\''
        cmd = 'dotenv -f '+env_path+' set -- '+key+' '+value  # set env variable
        os.system(cmd)


@app.route('/get')
def index():
    var1 = getdotenv('var1')   # retreive value of variable var1
    return var1

@app.route('/set')
def update():
    setdotenv('newValue2')   # set variable var2='newValue2'

【讨论】:

    【解决方案2】:

    听起来您可以从应用程序预加载中受益:

    http://docs.gunicorn.org/en/stable/settings.html#preload-app

    这将让您在分拆工作人员之前加载应用代码。

    【讨论】:

    • 听起来很有用。那么,这意味着它会根据每个请求构建一个新模型?
    • 在你剥离工作实例之前,它会在服务器上发生一些活动,以便它们都具有相同的访问权限。我不完全确定它是共享对象还是只是转储到每个工作人员中的副本。我发现当我们有代码在 x 次请求后丢弃工人时,它非常有用。
    猜你喜欢
    • 2017-08-23
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2023-02-14
    相关资源
    最近更新 更多