Tornado异步IO
2016-05-19 20:52
302 查看
Tornado提供了强大的异步IO机制,提高了服务器的响应能力.
tornado默认在处理函数返回时关闭链接,
需要调用RequestHandler.finish()方法关闭连接。
Tornado 通过 @asynchronous decorator 来实现异步请求,但使用的时候必须将 RequestHandler 和 callback 分离开,tornado.gen 模块可以帮助我们在一个函数里完成这两个工作。
@tornado.gen使用python的generator来实现异步。
该修饰器必须包含在
Task的构造器接受一个异步调用func(如http_client.fetch), 并把args和kwargs传给func.
在异步调用返回(发送消息)后yield Task对象,在异步调用返回结果赋给response,从下一行继续执行(和原生的Python协程相同).
注意Task的func必须是异步调用,否则仍会造成阻塞。
tornado自带的各种AsyncClient经常用于此种情形下。
在tornado3发布之后,强化了coroutine的概念,在异步编程中,gen.coroutine替代了原来的gen.engine,两者的使用是基本一致的。
从调用者角度说,
理解非阻塞和异步io的好机会……
@tornado.web.asynchronous
tornado默认在处理函数返回时关闭链接,@tornado.web.asynchronous修饰器使得连接保持开启, 即修饰器将RequestHandler 的 _auto_finish 属性置为 false.
需要调用RequestHandler.finish()方法关闭连接。
class IndexHandler(tornado.web.RequestHandler): def on_finish(): self.finish() @tornado.web.asynchronous def get(self): self.write('Async Hello') self.finish()
@tornado.gen.engine
Tornado 通过 @asynchronous decorator 来实现异步请求,但使用的时候必须将 RequestHandler 和 callback 分离开,tornado.gen 模块可以帮助我们在一个函数里完成这两个工作。@tornado.gen使用python的generator来实现异步。
该修饰器必须包含在
@asynchronous修饰器内层。
class GenAsyncHandler(RequestHandler): @asynchronous @gen.engine def get(self): http_client = AsyncHTTPClient() response = yield gen.Task(http_client.fetch, "http://example.com") do_something_with_response(response) self.render("template.html")
tornado.gen.Task(func, *args, **kwargs)
Task的构造器接受一个异步调用func(如http_client.fetch), 并把args和kwargs传给func.
在异步调用返回(发送消息)后yield Task对象,在异步调用返回结果赋给response,从下一行继续执行(和原生的Python协程相同).
注意Task的func必须是异步调用,否则仍会造成阻塞。
tornado自带的各种AsyncClient经常用于此种情形下。
@tornado.gen.coroutine
在tornado3发布之后,强化了coroutine的概念,在异步编程中,gen.coroutine替代了原来的gen.engine,两者的使用是基本一致的。从调用者角度说,
@gen.coroutine类似于
@return_future和
@gen.engine.
ioloop
Tornado依赖ioloop实现了非阻塞式(同步多路IO复用)的请求响应,ioloop采用epoll或者select实现。理解非阻塞和异步io的好机会……
相关文章推荐
- java模拟接口回调
- HDU 5335 Walk Out
- UVA575 Skew Binary
- android:layout_weight 使用方法
- 万圣节派对
- 具有静态和动态生存期对象的时钟程序
- AngularJs $scope.$apply
- Leetcode 344. Reverse String
- addLoadEvent应用方法
- 判断一个比较大的数是不是素数的方式(最简单的)
- 软件工程课堂作业——寻找“水王”
- 如何解决端口被占用情况
- leetcode笔记—map容器的使用
- hdu 4709 Herding
- html总结
- 蓝桥杯 算法提高 拿糖果
- 深入理解Activity启动模式(一)–Activity与进程,线程的关系
- hdu4973 A simple simulation problem.(成段更新+下标转化)
- java读写ini文件、FileOutputStream
- 字符与字节