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

2016-08-18 18:11:25 +08:00
 unfurl

我用 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对象,翻查了很多文档,没有找到解决办法

9862 次点击
所在节点    Python
10 条回复
binux
2016-08-18 18:15:58 +08:00
设计时你就应该想好这个问题。取决于需求和访问量

1. 使用 thread worker 来跑
2. 使用外部资源共享对象,例如数据库,文件等
3. 只跑一个 worker
unfurl
2016-08-18 18:18:34 +08:00
@binux 设计时访问量不大,直接跑就行了,现在想用 gunicorn 部署,才发现这个问题,尴尬了
paulw54jrn
2016-08-18 18:19:48 +08:00
这个涉及到操作系统进程的基本概念...
felixzhu
2016-08-18 18:23:22 +08:00
引入一个外部存储不就行了。开个 redis 啥的
unfurl
2016-08-18 18:25:07 +08:00
@felixzhu 我想先从代码层次来解决,实在不行只能上 redis 了
josephok
2016-08-18 19:10:02 +08:00
需要进程间通信了。
lvhuiyang
2016-08-18 20:31:04 +08:00
redis 正解
lovepython
2016-08-19 13:34:30 +08:00
基本进程间通信的可能性不大了,因为是 gun 控制的,
一楼的回答已经是最好的答案了
wuyu1998
2016-08-20 17:16:25 +08:00
用 NoSQL 存放 shared_dict 对象的序列化字符串。
alsoran1
2018-01-29 14:07:26 +08:00
请问楼主 这个问题当时怎么解决的?有用到共享内存吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/300237

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX