【Flask】Flask实现异步非阻塞请求功能
2016-10-24 21:39
423 查看
前言
最近做物联网项目的时候需要搭建一个异步非阻塞的HTTP服务器,经过查找资料,发现可以使用gevent包。关于gevent
Gevent 是一个 Python 并发网络库,它使用了基于 libevent 事件循环的 greenlet 来提供一个高级同步 API。下面是代码示例:from gevent.wsgi import WSGIServer from yourapplication import app http_server = WSGIServer(('', 5000), app) http_server.serve_forever()
代码清单
下面放上Flask异步非阻塞的代码清单,以后需要用到的时候直接移植即可。# coding=utf-8 # Python Version: 3.5.1 # Flask from flask import Flask, request, g # gevent from gevent import monkey from gevent.pywsgi import WSGIServer monkey.patch_all() # gevent end import time app = Flask(__name__) app.config.update(DEBUG=True) @app.route('/asyn/', methods=['GET']) def test_asyn_one(): print("asyn has a request!") time.sleep(10) return 'hello asyn' @app.route('/test/', methods=['GET']) def test(): return 'hello test' if __name__ == "__main__": # app.run() http_server = WSGIServer(('', 5000), app) http_server.serve_forever()
关于monkey.patch_all()
为什么要加monkey.patch_all()这一条语句呢?在gevnet的官网有详细的解释,这里简单说明一下:
monkey carefully replace functions and classes in the standard socket module with their cooperative counterparts. That way even the modules that are unaware of gevent can benefit from running in a multi-greenlet environment.
翻译:猴子补丁仔细的用并行代码副本替换标准socket模块的函数和类,这种方式可以使模块在不知情的情况下让gevent更好的运行于multi-greenlet环境中。
测试
打开浏览器,首先请求http://127.0.0.1:5000/asyn/,然后
再请求
http://127.0.0.1:5000/test/这个接口十次。如果是一般的Flask框架,后面的接口是没有响应的。
打印内容如下:
asyn has a request! 127.0.0.1 - - [2016-10-24 20:45:10] "GET /test/ HTTP/1.1" 200 126 0.000000 127.0.0.1 - - [2016-10-24 20:45:11] "GET /test/ HTTP/1.1" 200 126 0.000000 127.0.0.1 - - [2016-10-24 20:45:11] "GET /test/ HTTP/1.1" 200 126 0.000000 127.0.0.1 - - [2016-10-24 20:45:12] "GET /test/ HTTP/1.1" 200 126 0.000000 127.0.0.1 - - [2016-10-24 20:45:12] "GET /test/ HTTP/1.1" 200 126 0.000998 127.0.0.1 - - [2016-10-24 20:45:13] "GET /test/ HTTP/1.1" 200 126 0.001001 127.0.0.1 - - [2016-10-24 20:45:14] "GET /test/ HTTP/1.1" 200 126 0.000000 127.0.0.1 - - [2016-10-24 20:45:14] "GET /test/ HTTP/1.1" 200 126 0.001014 127.0.0.1 - - [2016-10-24 20:45:15] "GET /test/ HTTP/1.1" 200 126 0.001000 127.0.0.1 - - [2016-10-24 20:45:15] "GET /test/ HTTP/1.1" 200 126 0.000000 127.0.0.1 - - [2016-10-24 20:45:18] "GET /asyn/ HTTP/1.1" 200 126 10.000392
参考资料
http://blog.csdn.net/danny_amos/article/details/50859383相关文章推荐
- Flask实现异步非阻塞请求功能实例解析
- ASI和AFN实现POST异步请求的相同功能的代码
- ASI和AFN实现POST异步请求的同样功能的代码
- 使用tornado如何实现请求异步非阻塞?
- Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
- 通过异步请求实现报表组功能http://www.runqian.com.cn/archives/5059.html/
- 利用tornado使请求实现异步非阻塞
- 通过异步请求实现报表组功能
- ajax实现异步请求,不跳转页面的情况下,达到检验用户名等信息是否效果的功能!
- 异步发送添加请求的客户端实现
- 实例讲解Android中如何实现图片的异步加载功能
- struts2 jquery 插件实现ajax异步请求(网上资料)
- SetWaitableTimer 通过异步程序调用(APC)实现的定时功能
- LABjs --- Javascript实现异步加载和阻塞
- Ajax(asp.net)技术实现异步刷新和控件功能示例流程
- Ajax实现异步请求后台XML数据(初学Ajax整理笔记)
- 501 Not Implemented:服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。
- 同步、异步、阻塞、非阻塞 I/O 及 异步I/O实现
- 通过异步程序调用(APC)实现的定时功能
- 实现文件异步读写、暂停、继续、停止功能的类