请问大家一个很奇怪的问题:
我写了一个很简单的 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 下访问
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.