flask默认非阻塞学习

阻塞

Flask默认是不支持非阻塞IO的,表现为:

当 请求1未完成之前,请求2是需要等待处理状态,效率非常低。

from flask import Flask
import time

app=Flask(__name__)


@app.route("/test",methods=["GET"])
def wait():
    time.sleep(10) #模拟阻塞IO,也可以是其它比较耗时的func
    return "haha"

@app.route("/",methods=["GET"])
def hello():
    return "hello,world"

if __name__=="__main__":
    app.run()


请求1,先访问 http://localhost:5000/test

请求2,再马*问 http://localhost:5000/

发现,访问请求2时,没有立即返回内容,而是等请求1处理完成后,再处理请求1

以上的阻塞,就会造成效率十分低下



非阻塞

flask默认不支持非阻塞,有几种方法可以开启


  • 启用flask多线程机制
from flask import Flask
import time

app=Flask(__name__)


@app.route("/test",methods=["GET"])
def wait():
    time.sleep(10) #模拟阻塞IO
    return "haha"

@app.route("/",methods=["GET"])
def hello():
    return "hello,world"

if __name__=="__main__":
    app.run(threaded=True)


访问请求1,马*问请求2,请求2并不会受请求1影响


当然,如果在同一浏览器同时访问请求1,发现还是出现了,阻塞的情况,这是浏览器的限制,用隐身模式,或换一个浏览器访问就可以看出效果



使用gevent的monkey

from flask import Flask
import time
from gevent import monkey
from gevent.pywsgi import WSGIServer

monkey.patch_all()

app=Flask(__name__)


@app.route("/test",methods=["GET"])
def wait():
    time.sleep(10) #模拟阻塞IO
    return "haha"

@app.route("/",methods=["GET"])
def hello():
    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影响

上一篇:PHP判断文件是否被引入的方法get_included_files


下一篇:CVE-2019-1181 漏洞修复补丁下载 POC暂时未发布