高性能tornado框架简单实现restful接口及运维开发实例
2014-05-19 19:39
1231 查看
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python
的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。
有个朋友让我搞搞tornado框架,说实话,这个框架我用的不多。。。
我就把自己的一些个运维研发相关的例子,分享给大家。
![](http://img1.51cto.com/attachment/201309/131857209.png)
怎么安装tornado,我想大家都懂。
再来说说他的一些个模块,官网有介绍的。我这里再啰嗦的复读机一下,里面掺夹我的理解。
主要模块
web - FriendFeed 使用的基础 Web 框架,包含了 Tornado 的大多数重要的功能,反正你进入就对了。
escape - XHTML, JSON, URL 的编码/解码方法
database - 对 MySQLdb 的简单封装,使其更容易使用,是个orm的东西。
template - 基于 Python 的 web 模板系统,类似jinja2
httpclient - 非阻塞式 HTTP 客户端,它被设计用来和 web 及 httpserver 协同工作,这个类似加个urllib2
auth - 第三方认证的实现(包括 Google OpenID/OAuth、Facebook Platform、Yahoo BBAuth、FriendFeed OpenID/OAuth、Twitter OAuth)
locale - 针对本地化和翻译的支持
options - 命令行和配置文件解析工具,针对服务器环境做了优化,接受参数的
底层模块
httpserver - 服务于 web 模块的一个非常简单的 HTTP 服务器的实现
iostream - 对非阻塞式的 socket 的简单封装,以方便常用读写操作
ioloop - 核心的 I/O 循环
再来说说tornado接受请求的方式:
关于get的方式
这样我们访问 /niubi/123123123 就会走niubi这个类,里面的get参数。
关于post的方式
在tornado里面,一般get和post都在一个访问路由里面的,只是按照不同method来区分相应的。
扯淡的完了,大家测试下get和post。
http头部和http_code状态码的处理
更详细的参数
再来一个例子
模板:
我们把后端的值传到前端,可以是列表和字典
app.py里面的
模板里面的
下面我们再来扯扯tornado的异步。
tornado是一个异步web framework,说是异步,是因为tornado server与client的网络交互是异步的,底层基于io event loop。但是如果client请求server处理的handler里面有一个阻塞的耗时操作,那么整体的server性能就会下降。
源地址 http://rfyiamcool.blog.51cto.com/1030776/1298669
比如: 咱们访问一个路由 www.xiaorui.cc/sleep5 ,我在sleep5后端配置了等待5秒后给return值。
当我访问的话,肯定是要等5秒钟,这时候,要是有别的客户要连接的别的页面,不堵塞的页面,你猜他能马上显示吗?不能的。。。 他也是要等我访问5秒延迟过后,才能访问的。
幸运的是,tornado提供了一套异步机制,方便我们实现自己的异步操作。当handler处理需要进行其余的网络操作的时候,tornado提供了一个async http client用来支持异步。
上面的例子,主要有几个变化:
使用asynchronous decorator,它主要设置_auto_finish为false,这样handler的get函数返回的时候tornado就不会关闭与client的连接。
使用AsyncHttpClient,fetch的时候提供callback函数,这样当fetch http请求完成的时候才会去调用callback,而不会阻塞。
callback调用完成之后通过finish结束与client的连接。
rang
让我们来看看tornado在异步方面的能力。
大家看到了 http://10.2.20.111:8000/ceshi 花费了10s才有反应。。。
反应慢的原因是
![](http://img1.51cto.com/attachment/201309/192939738.jpg)
当他在堵塞的时候:
![](http://img1.51cto.com/attachment/201309/194056910.jpg)
我们访问别的路由:大家看到没有,可以显示,说明是不堵塞的
![](http://img1.51cto.com/attachment/201309/194128468.jpg)
我们针对堵塞的接口,并发下~
![](http://img1.51cto.com/attachment/201309/235054375.jpg)
源地址 http://rfyiamcool.blog.51cto.com/1030776/1298669
可以用gen模块来搞
简单点说就是gen 给了我们用同步代码来做异步实现的可能。
需要注意的是 下面这个是同步的机制
要改成异步的话,http_client = httpclient.AsyncHTTPClient()
demo的app代码:
这是我的那个demo的简化版,大家可以扩展他的功能。需要指出的是 这些功能任何一个web框架都可以实现的。tornado最大的优点是 他的异步,所以我们要重点要看他的异步实现。
简单测试下性能:
服务端和客户端服务器都是dell r720
![](http://img1.51cto.com/attachment/201309/194808241.jpg)
![](http://img1.51cto.com/attachment/201309/222023743.jpg)
客户端:
![](http://img1.51cto.com/attachment/201309/195022786.jpg)
![](http://img1.51cto.com/attachment/201309/195137924.jpg)
tornado的设计就是为了c10k,但为为啥看不出他的牛逼之处。
我想到的是没有优化内核的tcp承载,还有就是我们访问的route没有配置异步。 再次测试压力,10000个请求,在4s完成。
说实话,c10k我是不敢想,毕竟是单进程,你再异步也就那回事,对我来说他的异步不堵塞就够吸引人的了。
大家要是想要高性能的话,推荐用uwsgi的方式。
我的临时方案是用gevent做wsgi,提升还可以。
tornado的session可以轻易放到memcached里面,所以在nginx tornado框架下,会各种爽的。
![](http://img1.51cto.com/attachment/201309/161546180.png)
![](http://img1.51cto.com/attachment/201309/161546644.png)
转自:http://rfyiamcool.blog.51cto.com/1030776/1298669
的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。
有个朋友让我搞搞tornado框架,说实话,这个框架我用的不多。。。
我就把自己的一些个运维研发相关的例子,分享给大家。
![](http://img1.51cto.com/attachment/201309/131857209.png)
怎么安装tornado,我想大家都懂。
主要模块
web - FriendFeed 使用的基础 Web 框架,包含了 Tornado 的大多数重要的功能,反正你进入就对了。
escape - XHTML, JSON, URL 的编码/解码方法
database - 对 MySQLdb 的简单封装,使其更容易使用,是个orm的东西。
template - 基于 Python 的 web 模板系统,类似jinja2
httpclient - 非阻塞式 HTTP 客户端,它被设计用来和 web 及 httpserver 协同工作,这个类似加个urllib2
auth - 第三方认证的实现(包括 Google OpenID/OAuth、Facebook Platform、Yahoo BBAuth、FriendFeed OpenID/OAuth、Twitter OAuth)
locale - 针对本地化和翻译的支持
options - 命令行和配置文件解析工具,针对服务器环境做了优化,接受参数的
底层模块
httpserver - 服务于 web 模块的一个非常简单的 HTTP 服务器的实现
iostream - 对非阻塞式的 socket 的简单封装,以方便常用读写操作
ioloop - 核心的 I/O 循环
再来说说tornado接受请求的方式:
关于get的方式
关于post的方式
扯淡的完了,大家测试下get和post。
我们把后端的值传到前端,可以是列表和字典
app.py里面的
tornado是一个异步web framework,说是异步,是因为tornado server与client的网络交互是异步的,底层基于io event loop。但是如果client请求server处理的handler里面有一个阻塞的耗时操作,那么整体的server性能就会下降。
源地址 http://rfyiamcool.blog.51cto.com/1030776/1298669
比如: 咱们访问一个路由 www.xiaorui.cc/sleep5 ,我在sleep5后端配置了等待5秒后给return值。
当我访问的话,肯定是要等5秒钟,这时候,要是有别的客户要连接的别的页面,不堵塞的页面,你猜他能马上显示吗?不能的。。。 他也是要等我访问5秒延迟过后,才能访问的。
幸运的是,tornado提供了一套异步机制,方便我们实现自己的异步操作。当handler处理需要进行其余的网络操作的时候,tornado提供了一个async http client用来支持异步。
使用asynchronous decorator,它主要设置_auto_finish为false,这样handler的get函数返回的时候tornado就不会关闭与client的连接。
使用AsyncHttpClient,fetch的时候提供callback函数,这样当fetch http请求完成的时候才会去调用callback,而不会阻塞。
callback调用完成之后通过finish结束与client的连接。
rang
让我们来看看tornado在异步方面的能力。
大家看到了 http://10.2.20.111:8000/ceshi 花费了10s才有反应。。。
反应慢的原因是
![](http://img1.51cto.com/attachment/201309/192939738.jpg)
当他在堵塞的时候:
![](http://img1.51cto.com/attachment/201309/194056910.jpg)
我们访问别的路由:大家看到没有,可以显示,说明是不堵塞的
![](http://img1.51cto.com/attachment/201309/194128468.jpg)
我们针对堵塞的接口,并发下~
![](http://img1.51cto.com/attachment/201309/235054375.jpg)
源地址 http://rfyiamcool.blog.51cto.com/1030776/1298669
可以用gen模块来搞
简单点说就是gen 给了我们用同步代码来做异步实现的可能。
简单测试下性能:
服务端和客户端服务器都是dell r720
![](http://img1.51cto.com/attachment/201309/194808241.jpg)
![](http://img1.51cto.com/attachment/201309/222023743.jpg)
客户端:
![](http://img1.51cto.com/attachment/201309/195022786.jpg)
![](http://img1.51cto.com/attachment/201309/195137924.jpg)
tornado的设计就是为了c10k,但为为啥看不出他的牛逼之处。
我想到的是没有优化内核的tcp承载,还有就是我们访问的route没有配置异步。 再次测试压力,10000个请求,在4s完成。
大家要是想要高性能的话,推荐用uwsgi的方式。
我的临时方案是用gevent做wsgi,提升还可以。
![](http://img1.51cto.com/attachment/201309/161546180.png)
![](http://img1.51cto.com/attachment/201309/161546644.png)
转自:http://rfyiamcool.blog.51cto.com/1030776/1298669
相关文章推荐
- 高性能tornado框架简单实现restful接口及运维开发实例 推荐
- 高性能tornado框架简单实现restful接口及运维开发实例
- 高性能web服务器框架Tornado简单实现restful接口及开发实例
- Flask-RESTful接口开发学习笔记一:实现简单的GET请求
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- Flask-RESTful接口开发学习笔记一:实现简单的GET请求
- ssm框架下开发RESTful json简单实例
- 运用websrevice的CXF框架下的restful开发简单实例
- Yii1.1 实现简单restful 框架
- QuickCSharp框架开发(15)------定义SqlDbAuthenticationProvider对象、继承IAuthenticationProvider接口、实现Authenticate方
- 实现线上高性能接口方案nginx负载tornado后端lua数据 推荐
- django开发项目实例3--用session是实现简单的登陆、验证登陆和注销功能
- 一个简单的游戏开发框架(二.对外接口)
- 【Qt5开发及实例】13、实现一个简单的文本编辑器2
- 【Qt5开发及实例】12、实现一个简单的文本编辑器1
- 使用W“.NET技术”CF实现SOA面向服务编程——简单的WCF开发实例
- Java 反射学习(四)反射技术开发框架原理简单实现
- SP 短信开发-PROVISION接口实现-反向取消实例代码
- 使用WCF实现SOA面向服务编程——简单的WCF开发实例