我有一个我在请求中实例化的类(它是一个ML模型加载并在启动时需要一些时间来配置)。我们的想法是只执行一次并让每个请求都使用模型进行预测。 gunicorn每次都会实例化应用程序吗?
Aka,每当有新请求进入时,模型会重新训练吗?
答案 0 :(得分:1)
听起来你可以从应用程序预加载中受益:
http://docs.gunicorn.org/en/stable/settings.html#preload-app
这将允许您在剥离工作人员之前加载应用程序代码。
答案 1 :(得分:1)
对于那些正在寻找如何在不使用 Redis 或 Session 的情况下在Gunicorn工人之间共享变量的人来说,这是一个很棒的 {{ 3}} :
原理是可以使用open()
从文件中读取和写入共享变量,但是dotenv在这种情况下是完美的。
pip install python-dotenv
在应用目录中,创建.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'