阻塞
Flask默认是不支持非阻塞IO的,表现为:
当 请求1未完成之前,请求2是需要等待处理状态,效率非常低。
fromflaskimportFlaskimporttimeapp=Flask(__name__) route("/test",methods=["GET"]) .defwait(): time.sleep(10) #模拟阻塞IO,也可以是其它比较耗时的funcreturn"haha"route("/",methods=["GET"]) .defhello(): return"hello,world"if__name__=="__main__": app.run()
请求1,先访问 http://localhost:5000/test
请求2,再马上访问 http://localhost:5000/
发现,访问请求2时,没有立即返回内容,而是等请求1处理完成后,再处理请求1
以上的阻塞,就会造成效率十分低下
非阻塞
flask默认不支持非阻塞,有几种方法可以开启
- 启用flask多线程机制
fromflaskimportFlaskimporttimeapp=Flask(__name__) route("/test",methods=["GET"]) .defwait(): time.sleep(10) #模拟阻塞IOreturn"haha"route("/",methods=["GET"]) .defhello(): return"hello,world"if__name__=="__main__": app.run(threaded=True)
访问请求1,马上访问请求2,请求2并不会受请求1影响
当然,如果在同一浏览器同时访问请求1,发现还是出现了,阻塞的情况,这是浏览器的限制,用隐身模式,或换一个浏览器访问就可以看出效果
使用gevent的monkey
fromflaskimportFlaskimporttimefromgeventimportmonkeyfromgevent.pywsgiimportWSGIServermonkey.patch_all() app=Flask(__name__) route("/test",methods=["GET"]) .defwait(): time.sleep(10) #模拟阻塞IOreturn"haha"route("/",methods=["GET"]) .defhello(): return"hello,world"if__name__=="__main__": # app.run(threaded=True)http_server=WSGIServer(('0.0.0.0',5000),app) http_server.serve_forever()
访问请求1,马上访问请求2,请求2并不会受请求1影响