tornado之异步web服务二
前面介绍了异步方法带来的显著性能提升。我们来看下异步使用的方法。
1 首先对于get方法使用tornado.web.asynchronous进行装饰。当使用tornado.web.asynchronous进行装饰的时候,Tornado不会自己关闭连接。
你必须在你的RequestHandler对象中调用finish方法来显式地告诉Tornado关闭连接否则,请求将可能挂起,浏览器可能不会显示我们已经发送给客户端的数据。)。简单点来说,就是在RequestHandler中,_auto_finish被初始化为True,在get函数执行完后自动执行self.finish函数来结束连接。但是如果get被asynchronous装饰后,_auto_finish将会被设置为False 这样除非手动调用self.finish。也就是在回调函数中等获取到目标url的信息后执行self.finish。在这期间,创建的是非阻塞的socket连接(AsyncHTTPClient)。在等待目标URL反馈的期间控制权交给ioloop中去运行其他的连接。等到数据就绪之后再切回来。使异步变得可能。这就有点像一个时分系统,当任务A还未完成的时候,起一个中断然后继续运行任务B,等到任务A的响应数据到来。继续执行任务A。避免了任务A的超长处理导致任务阻塞。
异步生成器:
当我们有两个或更多的异步请求要执行的时候,编码和维护都显得非常困难,每个都依赖于前面的调用:不久你就会发现自己调用了一个回调函数的回调函数的回调函数。下面就是一个例子:在一个get函数触发中,需要获取不同的url内容。有多少个url我们就得写多少个不同的回调函数。
def get(self):
client = AsyncHTTPClient()
client.fetch("http://example.com", callback=on_response)
def on_response(self, response):
client = AsyncHTTPClient()
client.fetch("http://another.example.com/", callback=on_response2)
def on_response2(self, response):
client = AsyncHTTPClient()
client.fetch("http://still.another.example.com/", callback=on_response3)
def on_response3(self, response):
[etc., etc.]
tornado提供了一个更为简介的方法来实现这种情况。下面是示例代码:
class indexHandler_test1(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self, *args, **kwargs):
query = self.get_argument('a').encode('utf-8')
url2='http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13541078274'
client = tornado.httpclient.AsyncHTTPClient()
response=yield tornado.gen.Task(client.fetch,("http://gc.ditu.aliyun.com/geocoding?"+urllib.urlencode({'a':query})))
print response.body
response1 = yield tornado.gen.Task(client.fetch,(url2))
print response1.body
self.write(response.body+'\n'+(response1.body).decode('GB2312').encode('utf-8'))
self.finish()
首先采用@tornado.gen.engine对其进行装饰,且必须位于get函数之前。然后采用yield关键字产生2个task分别指向不同的url。最终将两个url的返回结果整合在一起显示在网页上

我们使用Python的yield关键字以及tornado.gen.Task对象的一个实例,将我们想要的调用和传给该调用函数的参数传递给那个函数。这里,yield的使用返回程序对Tornado的控制,允许在HTTP请求进行中执行其他任务。当HTTP请求完成时,RequestHandler方法在其停止的地方恢复。这种构建的美在于它在请求处理程序中返回HTTP响应,而不是回调函数中。因此,代码更易理解:所有请求相关的逻辑位于同一个位置。而HTTP请求依然是异步执行的,所以我们使用tornado.gen可以达到和使用回调函数的异步请求版本相同的性能。
tornado之异步web服务二的更多相关文章
- tornado之异步web服务一
大部分Web应用(包括我们之前的例子)都是阻塞性质的,也就是说当一个请求被处理时,这个进程就会被挂起直至请求完成.在大多数情况下,Tornado处理的Web请求完成得足够快使得这个问题并不需要被关注. ...
- Python开发【Tornado】:异步Web服务(一)
异步Web服务 前言: 到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择.然而,Tornado ...
- 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务
http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...
- 如何设计一个异步Web服务——任务调度
接上一篇<如何设计一个异步Web服务——接口部分> Application已经将任务信息发到了Service服务器中,接下来,Service服务器改如何对自身的资源进行合理分配以满足App ...
- 如何设计一个异步Web服务——接口部分
需求比较简单,提供一个异步Web服务供使用者调用.比如说,某应用程序需要批量地给图片加lomo效果.由于加lomo效果这个操作非常消耗CPU资源,所以我们需要把这个加lomo效果的程序逻辑放到一台单独 ...
- Python开发【Tornado】:异步Web服务(二)
真正的 Tornado 异步非阻塞 前言: 其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Torn ...
- 深入理解Tornado——一个异步web服务器
本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...
- 第五章:异步Web服务
到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择.然而,Tornado受到最多关注的功能是其异 ...
- Tornado创建一个web服务
import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options import con ...
随机推荐
- 在 Ubuntu 下使用 com port, serial port
1. Install putty 2. Insert serial-to-usb converter cable converter to NB or PC 3. check converter un ...
- /sys/class/gpio 文件接口操作IO端口(s3c2440)
http://blog.csdn.net/mirkerson/article/details/8464231 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的 ...
- 使用android ndk编译boost动态库
由于以往我写过不少使用boost库开发的项目,而最近准备移植一些代码到android上(上层界面以及jni层我不管,也没研究过,现在只完成代码的移植编译,具体如何调用,由其它人负责),所以先要解决的就 ...
- yii 数据save后得到插入id
$model->save();//得到上次插入的Insert id$id = $model->attributes['id'];如此很简单
- AC日记——猴子 cogs 2043
2043. 猴子 ★★ 输入文件:monkeya.in 输出文件:monkeya.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 有n只猴子,第一只尾巴挂在树上 ...
- ARC072/ABC059
AtCoder Regular Contest 072 / Beginner Contest 059 Announcement <br > 猛然发现今天有一场AC.....然后..显示手残 ...
- ui develop
https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOS/DesigningaUserInt ...
- 邁向IT專家成功之路的三十則鐵律 鐵律二十八 IT人教學之道-速戰
所謂IT人教學之道是指可善用在工作之中帶領新人快速上手,或是使用在生活中指導他人迅速學會某項技能的重要經驗.相信大家都有當過新手被指導的體驗,也有擔任過資深的老手帶領新人的經驗.然而您可能不知道,即便 ...
- 邁向IT專家成功之路的三十則鐵律 鐵律二十:IT人證照之道-收斂
這是一個各行各業都講究專業證照的世代,彷彿證照只要比別人少一些就感覺自己遜掉了.現今IT領域的證照肯定是所有行業中最複雜的,無論是想求職升遷的還是想轉進IT跑道的,許多人由於受到媒體與廣告的影響,都不 ...
- python 工具 二进制文件处理之——去掉指定长度数据包头
包头48bit 数据98464 ...如此循环: piece_size = 48 piece_size1 = 98464 with open("C:\\Users\\Administrato ...