gunicorn和共享变量如何工作

时间:2017-02-08 20:17:00

标签: python flask gunicorn

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

Aka,每当有新请求进入时,模型会重新训练吗?

2 个答案:

答案 0 :(得分:1)

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

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

这将允许您在剥离工作人员之前加载应用程序代码。

答案 1 :(得分:1)

对于那些正在寻找如何在不使用 Redis Session 的情况下在Gunicorn工人之间共享变量的人来说,这是一个很棒的 {{ 3}}
原理是可以使用open()从文件中读取和写入共享变量,但是dotenv在这种情况下是完美的。

  1. pip install python-dotenv

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

     var1="value1"
     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'