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使用详解”)进行压力测试,结果如下:
同步压力测试:
- [root@51dev 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生成器,函数,数组” ),
yield关键字的作用是返回控制,异步任务执行完毕后,程序在yield的地方恢复。
可以看到使用生成器,异步后业务处理不是在回调函数中完成的,看起来像同步处理一样,代码逻辑更清晰。
使用生成器和回调函数异步请求是一样的。
6.异步请求的适用场景
请求处理逻辑复杂耗时,或长时间请求数据库的时候,异步请求可以大幅提升并发请求效率。
同时综合考虑缓存,业务逻辑放在客户端等手段,来缓解服务器压力。
参考资料:http://docs.pythontab.com/tornado/introduction-to-tornado/ch5.html
tornado异步web请求的更多相关文章
- 基元用户模式构造--互锁构造 Interlocked 实现的异步web请求实例
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...
- 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务
http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...
- Python开发【Tornado】:异步Web服务(一)
异步Web服务 前言: 到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择.然而,Tornado ...
- Tornado异步(2)
Tornado异步 因为epoll主要是用来解决网络IO的并发问题,所以Tornado的异步编程也主要体现在网络IO的异步上,即异步Web请求. 1. tornado.httpclient.Async ...
- 第五章:异步Web服务
到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择.然而,Tornado受到最多关注的功能是其异 ...
- tornado异步编程
说明 以下的例子都有2个url,一个是耗时的请求,一个是可以立刻返回的请求,,我们希望的是访问立刻返回结果的请求不会被其他耗时请求影响 非异步处理 现在我们请求sleep然后同时请求justnow,发 ...
- 5.(基础)tornado异步
终于到了传说中的异步了,感觉异步这个名字听起来就很酷酷的,以前还不是多擅长Python时,就跑去看twisted的源码,结果给我幼小的心灵留下了创伤.反正包括我在内,都知道异步编程很强大,但是却很少在 ...
- 7.2 Tornado异步
7.2 Tornado异步 因为epoll主要是用来解决网络IO的并发问题,所以Tornado的异步编程也主要体现在网络IO的异步上,即异步Web请求. 1. tornado.httpclient.A ...
- 深入理解Tornado——一个异步web服务器
本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...
随机推荐
- IDE的文件和代码模板
设置IDE的的模板,可以在创建文件的时候,自动产生模板内容,模板里可以 模板头设置: # -*- coding: utf- -*- """ --------------- ...
- windows安装dcm4chee 出错 check file system group LOSSY_STORAGE for deletion
错误情景: 解决方法: 更改服务的监听端口(参考DICOM:Ubuntu14环境下安装dcm4chee+oviyam2.1)
- win8自带输入法如何切换全角、半角操作流程
原文参考:http://jingyan.baidu.com/article/066074d6620c45c3c21cb0d3.html 曾经不知道怎么切换半角全角的时候非常抓狂(原因是不知道是半角全角 ...
- Oracle PL/SQL语句基础学习笔记(上)
PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE server和其它工具中了,近几年中很多其它的开发者和DBA開始使用PL/SQL,本文将讲述PL ...
- (1)风色从零单排《C++ Primer》 一个简单的c++程序
从零单排<C++ Primer> --(1)一个简单的c++程序 本次学习收获 0.写在前面 风色以前上过C++的课程,然而当时并没有认真去学,基本不能使用c++来作项目开发. 这次又一次 ...
- 数据库:mongodb与关系型数据库相比的优缺点zz (转)
与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问速度:举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值 ...
- Python写的简陋版一对一聊天工具,全双工
好该睡觉了,明天还要上班~~~直接上代码,后面再总结 import threading import os import socket def RecvProcess ( UDP_Socket, Lo ...
- 《Go并发编程实战》第2版 紧跟Go的1.8版本号
文章作者:郝林(<Go并发编程实战 (第2版)>作者) 最终来了! 经过出版社的各位编辑.校对.排版伙伴与我的N轮PK和共同努力,<Go并发编程实战>第2版的全部内容最终全然确 ...
- Python编程-基础知识-python项目包和文件的管理以及如何引用相对路径的包和模块
目录 结构: core |____ __init__.py |____ basic |____ __init__.py |____ database |____ __init__. ...
- 【Leet Code】String to Integer (atoi) ——常考类型题
String to Integer (atoi) Total Accepted: 15482 Total Submissions: 106043My Submissions Implement ato ...