Flask实现异步非阻塞请求功能实例解析
本文研究的主要是Flask实现异步非阻塞请求功能,具体实现如下。
最近做物联网项目的时候需要搭建一个异步非阻塞的HTTP服务器,经过查找资料,发现可以使用gevent包。
关于gevent
Gevent是一个Python并发网络库,它使用了基于libevent事件循环的greenlet来提供一个高级同步API。下面是代码示例:
fromgevent.wsgiimportWSGIServer
fromyourapplicationimportapp
http_server=WSGIServer(('',5000),app)
http_server.serve_forever()
代码清单
下面放上Flask异步非阻塞的代码清单,以后需要用到的时候直接移植即可。
#coding=utf-8
#PythonVersion:3.5.1
#Flask
fromflaskimportFlask,request,g
#gevent
fromgeventimportmonkey
fromgevent.pywsgiimportWSGIServer
monkey.patch_all()
#geventend
importtime
app=Flask(__name__)
app.config.update(DEBUG=True)
@app.route('/asyn/',methods=['GET'])
deftest_asyn_one():
print("asynhasarequest!")
time.sleep(10)
return'helloasyn'
@app.route('/test/',methods=['GET'])
deftest():
return'hellotest'
if__name__=="__main__":
#app.run()
http_server=WSGIServer(('',5000),app)
http_server.serve_forever()
关于monkey.patch_all()
为什么要加monkey.patch_all()这一条语句呢?在gevnet的官网有详细的解释,这里简单说明一下:
monkeycarefullyreplacefunctionsandclassesinthestandardsocketmodulewiththeircooperativecounterparts.Thatwayeventhemodulesthatareunawareofgeventcanbenefitfromrunninginamulti-greenletenvironment.
翻译:猴子补丁仔细的用并行代码副本替换标准socket模块的函数和类,这种方式可以使模块在不知情的情况下让gevent更好的运行于multi-greenlet环境中。
测试
打开浏览器,首先请求http://127.0.0.1:5000/asyn/,然后
再请求http://127.0.0.1:5000/test/这个接口十次。如果是一般的Flask框架,后面的接口是没有响应的。
打印内容如下:
asynhasarequest!
127.0.0.1--[2016-10-2420:45:10]"GET/test/HTTP/1.1"2001260.000000
127.0.0.1--[2016-10-2420:45:11]"GET/test/HTTP/1.1"2001260.000000
127.0.0.1--[2016-10-2420:45:11]"GET/test/HTTP/1.1"2001260.000000
127.0.0.1--[2016-10-2420:45:12]"GET/test/HTTP/1.1"2001260.000000
127.0.0.1--[2016-10-2420:45:12]"GET/test/HTTP/1.1"2001260.000998
127.0.0.1--[2016-10-2420:45:13]"GET/test/HTTP/1.1"2001260.001001
127.0.0.1--[2016-10-2420:45:14]"GET/test/HTTP/1.1"2001260.000000
127.0.0.1--[2016-10-2420:45:14]"GET/test/HTTP/1.1"2001260.001014
127.0.0.1--[2016-10-2420:45:15]"GET/test/HTTP/1.1"2001260.001000
127.0.0.1--[2016-10-2420:45:15]"GET/test/HTTP/1.1"2001260.000000
127.0.0.1--[2016-10-2420:45:18]"GET/asyn/HTTP/1.1"20012610.000392
总结
以上就是本文关于Flask实现异步非阻塞请求功能实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!