flask, gunicorn 的一个奇怪问题

2020-03-05 19:55:33 +08:00
 shallows

请问大家一个很奇怪的问题:
我写了一个很简单的 flask

from flask import Flask

app = Flask(__name__)

@app.route('/index')
def index():
    print("get index")
    time.sleep(5)
    print("leave index")
    return "index"

@app.route('/main')
def main():
    print("get main")
    time.sleep(5)
    print("leave main")
    return "main"

然后用 gunicorn 运行它,没有任何配置,就开启两个进程

$ gunicorn -w 2 -b 192.168.40.129:5000 app:app
[2020-03-05 19:25:33 +0800] [11947] [INFO] Starting gunicorn 20.0.4
[2020-03-05 19:25:33 +0800] [11947] [INFO] Listening at: http://192.168.40.129:5000 (11947)
[2020-03-05 19:25:33 +0800] [11947] [INFO] Using worker: sync
[2020-03-05 19:25:33 +0800] [11951] [INFO] Booting worker with pid: 11951
[2020-03-05 19:25:33 +0800] [11952] [INFO] Booting worker with pid: 11952

我用两个浏览器窗口分别访问 /main 和 /index:

get main
get index
leave main
leave index

这符合预期,毕竟两个进程

我用两个浏览器窗口同时访问 /index 时,问题出现了:

get index
leave index
get index
leave index

很明显第二个进程被阻塞了,但为什么?明明是两个进程。如果说是两个线程,也许可能出现这问题,我不确定。但 fork 进程后,不应该连内存空间也被复制么?进程理论上不会出现这问题才对?
在 linux 虚拟机里运行,在 windows 下访问

1176 次点击
所在节点    问与答
7 条回复
gwy15
2020-03-05 20:36:54 +08:00
shallows
2020-03-05 21:21:51 +08:00
@gwy15 谢谢
我 curl 发现的确没这问题,之前发现有问题是因为用 chrome 测试,用火狐也没有这问题
不是很清楚 chrome 工作原理,估计是某些设置导致的
fanjianhang
2020-03-06 08:38:17 +08:00
是 worker 机制问题吗,另外想问下 worker 配置大于等于 2 的话,有些初始化动作只要一次就行,这样怎么解决
julyclyde
2020-03-06 11:13:12 +08:00
@fanjianhang 你需要检讨需求了,一次性的需求就不该放在 web 里
fanjianhang
2020-03-06 12:26:10 +08:00
@julyclyde 请问这种一次性需求配合 gunicorn 应该放哪呢
shallows
2020-03-06 18:00:41 +08:00
什么一次性需求?进程间通信,数据库或者 redis 的标志,不都可以阻止其他进程执行同一代码么,如果说服务有些初始化动作,还是建议不放在 web 里
shallows
2020-03-06 18:01:05 +08:00

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

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

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

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

© 2021 V2EX