V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
unfurl
V2EX  ›  Python

gunicorn+flask, 不同的 worker 之间怎么共享一个对象

  •  
  •   unfurl · 2016-08-18 18:11:25 +08:00 · 9869 次点击
    这是一个创建于 3020 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用 flask 实现了两个接口,用于操作一个字典对象,伪代码如下:

    # -*- coding: utf-8 -*-
    
    from flask import Flask, request
    
    app = Flask(__name__)
    shared_dict = dict()
    
    
    @app.route("/set")
    def set():
        shared_dict[...] = request...
    
    
    @app.route("/get")
    def get():
        return shared_dict[...]
    

    直接用app.run()这个程序没有任何问题

    现在想要部署用gunicorn+flask的方式部署,启动参数gunicorn -w 4 main:app

    我发现不同的 worker 不是共用这个shared_dict对象,翻查了很多文档,没有找到解决办法

    10 条回复    2018-01-29 14:07:26 +08:00
    binux
        1
    binux  
       2016-08-18 18:15:58 +08:00   ❤️ 2
    设计时你就应该想好这个问题。取决于需求和访问量

    1. 使用 thread worker 来跑
    2. 使用外部资源共享对象,例如数据库,文件等
    3. 只跑一个 worker
    unfurl
        2
    unfurl  
    OP
       2016-08-18 18:18:34 +08:00
    @binux 设计时访问量不大,直接跑就行了,现在想用 gunicorn 部署,才发现这个问题,尴尬了
    paulw54jrn
        3
    paulw54jrn  
       2016-08-18 18:19:48 +08:00
    这个涉及到操作系统进程的基本概念...
    felixzhu
        4
    felixzhu  
       2016-08-18 18:23:22 +08:00
    引入一个外部存储不就行了。开个 redis 啥的
    unfurl
        5
    unfurl  
    OP
       2016-08-18 18:25:07 +08:00
    @felixzhu 我想先从代码层次来解决,实在不行只能上 redis 了
    josephok
        6
    josephok  
       2016-08-18 19:10:02 +08:00 via Android
    需要进程间通信了。
    lvhuiyang
        7
    lvhuiyang  
       2016-08-18 20:31:04 +08:00
    redis 正解
    lovepython
        8
    lovepython  
       2016-08-19 13:34:30 +08:00
    基本进程间通信的可能性不大了,因为是 gun 控制的,
    一楼的回答已经是最好的答案了
    wuyu1998
        9
    wuyu1998  
       2016-08-20 17:16:25 +08:00
    用 NoSQL 存放 shared_dict 对象的序列化字符串。
    alsoran1
        10
    alsoran1  
       2018-01-29 14:07:26 +08:00
    请问楼主 这个问题当时怎么解决的?有用到共享内存吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2942 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:08 · PVG 08:08 · LAX 16:08 · JFK 19:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.