请问大家一个很奇怪的问题:
我写了一个很简单的 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 下访问
1
gwy15 2020-03-05 20:36:54 +08:00
|
2
shallows OP |
3
fanjianhang 2020-03-06 08:38:17 +08:00 via Android
是 worker 机制问题吗,另外想问下 worker 配置大于等于 2 的话,有些初始化动作只要一次就行,这样怎么解决
|
4
julyclyde 2020-03-06 11:13:12 +08:00
@fanjianhang 你需要检讨需求了,一次性的需求就不该放在 web 里
|
5
fanjianhang 2020-03-06 12:26:10 +08:00
@julyclyde 请问这种一次性需求配合 gunicorn 应该放哪呢
|
6
shallows OP 什么一次性需求?进程间通信,数据库或者 redis 的标志,不都可以阻止其他进程执行同一代码么,如果说服务有些初始化动作,还是建议不放在 web 里
|
7
shallows OP |