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实现异步非阻塞请求功能实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!