如何在gunicorn进程之间共享字典?

时间:2017-01-30 15:41:12

标签: python webserver multiprocessing gunicorn

我有一个带有全局字典变量的服务器代码。它适用于单个进程gunicorn,但是当我进行多进程时它会出错,因为在这个字典中没有达到一个值。我相信这是因为这个字典不能在进程之间共享。你知道这种问题的解决方法吗?

3 个答案:

答案 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在这种情况下是完美的。

  1. pip install python-dotenv

  2. 在应用目录中,创建.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后很容易。