请问大家一个很奇怪的问题:
我写了一个很简单的 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 下访问