tornado异步web请求

1.为什么要使用异步web服务
使用异步非阻塞请求,并发处理更高效。

2.同步与异步请求比较
同步请求时,web服务器进程是阻塞的,也就是说当一个请求被处理时,服务器进程会被挂起直至请求完成。

异步请求时,web服务器进程在等待请求处理过程中,让I/O循环打开,以便服务于其他请求,请求处理完成后继续执行回调函数或生成器,而不再是等待请求过程中挂起进程。整个过程是异步的。

3.同步与异步请求示例
同步请求:

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        client=tornado.httpclient.HTTPClient()
        response=client.fetch("http://test.com/list")
        self.write("success")

异步请求:

class IndexAsyncHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        client=tornado.httpclient.AsyncHTTPClient()
        client.fetch("http://test.com/list",callback=self.on_response)
    def on_response(self,response):
        self.write("success")
        self.finish()

路由配置:

(r‘/test‘, test_async.IndexHandler),
(r‘/testasync‘, test_async.IndexAsyncHandle)

使用http_load工具(关于http_load的使用参见“http_load使用详解” http://www.cnblogs.com/shijingjing07/p/6539179.html)进行压力测试,结果如下:
同步压力测试:

[[email protected] http_load-12mar2006]# ./http_load -p 100 -s 60 url
27 fetches, 100 max parallel, 189 bytes, in 60 seconds
7 mean bytes/connection
0.45 fetches/sec, 3.15 bytes/sec
msecs/connect: 0.113037 mean, 0.258 max, 0.021 min
msecs/first-response: 31186.5 mean, 59721.3 max, 2246.32 min
HTTP response codes:
code 200 -- 27

异步压力测试:

209 fetches, 100 max parallel, 1463 bytes, in 60.0046 seconds
7 mean bytes/connection
3.48306 fetches/sec, 24.3814 bytes/sec
msecs/connect: 0.0944641 mean, 0.387 max, 0.021 min
msecs/first-response: 20088 mean, 30650 max, 10601.1 min
HTTP response codes:
code 200 -- 209

对比可以看出,在60s时间内,并发请求数量为100的情况下,
同步请求只有27个请求响应,而异步请求达到了209个

4.异步请求使用说明
同步请求在请求完毕后,自动关闭连接。
异步请求保持连接开启,需要手动关闭连接。
tornado中使用@tornado.web.asynchronous装饰器作用是保持连接一直开启,
回调函数执行完毕后,调用finish方法来主动关闭连接。

5.异步生成器
上例中,是使用回调函数来做业务处理及关闭连接的。
回调函数的缺点是,可能引起回调深渊,系统将难以维护。如回调中调用回调。

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.]

tornado2.1引入了tornado.gen模块,可以更整洁地执行异步请求。
异步请求:

class IndexGenHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.engine
    def get(self):
        client=tornado.httpclient.AsyncHTTPClient()
        response=yield tornado.gen.Task(client.fetch,"http://test.com/list")
        self.write("success")
        self.finish()

路由配置:

(r‘/testgen‘, test_async.IndexGenHandler),

异步压力测试:

207 fetches, 100 max parallel, 1449 bytes, in 60.0055 seconds
7 mean bytes/connection
3.44968 fetches/sec, 24.1478 bytes/sec
msecs/connect: 0.113483 mean, 0.948 max, 0.024 min
msecs/first-response: 20156.5 mean, 32294.2 max, 9607.34 min
HTTP response codes:
code 200 -- 207

tornado.gen是一个生成器(关于生成器参见“python生成器,函数,数组” http://www.cnblogs.com/shijingjing07/p/6478539.html),
yield关键字的作用是返回控制,异步任务执行完毕后,程序在yield的地方恢复。
可以看到使用生成器,异步后业务处理不是在回调函数中完成的,看起来像同步处理一样,代码逻辑更清晰。
使用生成器和回调函数异步请求是一样的。

6.异步请求的适用场景
请求处理逻辑复杂耗时,或长时间请求数据库的时候,异步请求可以大幅提升并发请求效率。
同时综合考虑缓存,业务逻辑放在客户端等手段,来缓解服务器压力。

时间: 2024-10-23 01:19:36

tornado异步web请求的相关文章

基元用户模式构造--互锁构造 Interlocked 实现的异步web请求实例

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net.Http; 5 using System.Text; 6 using System.Threading; 7 using System.Threading.Tasks; 8 9 namespace Test 10 { 11 enum CoordinationStatus 12 { 13 AllDone, 14 Ca

《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth310/itt2zh上面持续更新,本文内容可能不是最新状态,请在GitHub上获得最新版本. 本文也可在http://demo.pythoner.com/itt2zh上进行格式化的预览. 第五章:异步Web服务 到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性

第五章:异步Web服务

到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择.然而,Tornado受到最多关注的功能是其异步取得和提供内容的能力,它有着很好的理由:它使得处理非阻塞请求更容易,最终导致更高效的处理以及更好的可扩展性.在本章中,我们将看到Tornado异步请求的基础,以及一些推送技术,这种技术可以使你使用更少的资源来提供更多的请求以编写更简单的Web应用. 5.1 异步Web请求 大部分Web应用(包括我

深入理解Tornado——一个异步web服务器

本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原文地址:http://golubenco.org/?p=16 这篇文章的目的在于对Tornado这个异步服务器软件的底层进行一番探索.我采用自底向上的方式进行介绍,从轮巡开始,向上一直到应用层,指出我认为有趣的部分.所以,如果你有打算要阅读Tornado这个web框架的源码,又或者是你对一个异步we

Python开发【Tornado】:异步Web服务

异步Web服务 前言: 到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择.然而,Tornado受到最多关注的功能是其异步取得和提供内容的能力,它有着很好的理由:它使得处理非阻塞请求更容易,最终导致更高效的处理以及更好的可扩展性.在本章中,我们将看到Tornado异步请求的基础,以及一些推送技术,这种技术可以使你使用更少的资源来提供更多的请求以编写更简单的Web应用. 大部分Web应用(包括我

tornado异步请求非阻塞-乾颐堂

前言 也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了.比如最近发现一个事情:某网站打开页面很慢,服务器cpu/内存都正常.网络状态也良好. 后来发现,打开页面会有很多请求后端数据库的访问,有一个mongodb的数据库业务api的rest服务.但是它的tornado却用错了,一步步的来研究问题: 说明 以下的例子都有2个url,一个是耗时的请求,一个是可以或者说需要立刻返回的请求,我想就算一个对技术不熟,从道理上来说的用户,

tornado异步请求非阻塞

前言也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了 比如最近发现一个事情:某网 前言 也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了.比如最近发现一个事情:某网站打开页面很慢,服务器cpu/内存都正常.网络状态也良好. 后来发现,打开页面会有很多请求后端数据库的访问,有一个mongodb的数据库业务api的rest服务.但是它的tornado却用错了,一

ANTS Performance Profiler 8:支持对Web请求、异步代码和WinRT的性能剖析

下载与激活:http://download.csdn.net/detail/lone112/6734291 离线激活 位于英国的Red Gate Software有限公司最近发布了ANTS Performance Profiler 8 Beta,支持对Web请求.异步代码和Windows商店应用的性能剖析.该版本还支持SharePoint 2013和一个新的时间线,这使开发者不但能够监控应用程序的性能,还能深入到想要检查的具体区域. Web请求剖析使开发者能够捕获向外的HTTP请求,其中包括请求

iOS.访问 Web Service.异步GET请求方法

#import <UIKit/UIKit.h> #import "T20140628024750NSNumber+Message.h" #import "T20140628024750NSString+URLEncoding.h" @interface T20140628024750ViewController : UITableViewController<NSURLConnectionDelegate> @property (nonato