V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
shallows
V2EX  ›  问与答

flask, gunicorn 的一个奇怪问题

  •  
  •   shallows · 2020-03-05 19:55:33 +08:00 · 1177 次点击
    这是一个创建于 1725 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    7 条回复    2020-03-06 18:01:05 +08:00
    gwy15
        1
    gwy15  
       2020-03-05 20:36:54 +08:00
    shallows
        2
    shallows  
    OP
       2020-03-05 21:21:51 +08:00
    @gwy15 谢谢
    我 curl 发现的确没这问题,之前发现有问题是因为用 chrome 测试,用火狐也没有这问题
    不是很清楚 chrome 工作原理,估计是某些设置导致的
    fanjianhang
        3
    fanjianhang  
       2020-03-06 08:38:17 +08:00 via Android
    是 worker 机制问题吗,另外想问下 worker 配置大于等于 2 的话,有些初始化动作只要一次就行,这样怎么解决
    julyclyde
        4
    julyclyde  
       2020-03-06 11:13:12 +08:00
    @fanjianhang 你需要检讨需求了,一次性的需求就不该放在 web 里
    fanjianhang
        5
    fanjianhang  
       2020-03-06 12:26:10 +08:00
    @julyclyde 请问这种一次性需求配合 gunicorn 应该放哪呢
    shallows
        6
    shallows  
    OP
       2020-03-06 18:00:41 +08:00
    什么一次性需求?进程间通信,数据库或者 redis 的标志,不都可以阻止其他进程执行同一代码么,如果说服务有些初始化动作,还是建议不放在 web 里
    shallows
        7
    shallows  
    OP
       2020-03-06 18:01:05 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1248 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:35 · PVG 01:35 · LAX 09:35 · JFK 12:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.