我有一个带有全局字典变量的服务器代码。它适用于单个进程gunicorn,但是当我进行多进程时它会出错,因为在这个字典中没有达到一个值。我相信这是因为这个字典不能在进程之间共享。你知道这种问题的解决方法吗?
答案 0 :(得分:3)
我很遗憾地说,如果你试图访问Gunicorn工作人员(例如gevent)的不同实例之间的共享python对象,你需要使用共享服务来实现它,例如加载/保存到Redis数据库中。
由于每个Gunicorn工作进程都有自己的进程ID,因此无法从其他进程访问共享内存。
在这里您可以找到更多信息: https://github.com/benoitc/gunicorn/issues/1026
问候。
答案 1 :(得分:0)
寻找如何在不使用 Redis 或 Session 的情况下在Gunicorn工人之间共享变量,这是一个很棒的 python dotenv < / strong>:
原理是从文件中读取和写入共享变量,这可以用open()
完成,但是dotenv在这种情况下是完美的。
pip install python-dotenv
在应用目录中,创建.env文件:
├──.env
└──app.py
.env :
dic1="{\"key1\":\"value1\"}" dic2="{\"key2\":\"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'
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():
serialized_dic1 = getdotenv('dic1') # retreive value of variable dic1
return serialized_dic1
@app.route('/set')
def update():
setdotenv('{\"key2\":\"newValue2\"}') # set variable dic2='{\"key1\":\"value1\"}'
答案 2 :(得分:-1)
我执行以下操作,可能不是一个确切的解决方案,但仍然有效。我在pyredis上使用Redis来保持值需要在btw进程中共享。安装Redis后很容易。