玩蛇记-使用tornado构建高性能Web应用之一

这个新系列是为了记录在python下的工作点滴,最近从微软平台突然转换到了linux平台下工作,于是.NET不怎么排得上用场,且在python下工作多日才发现原来在.NET下的日子真是往事不堪回首月明中……当然仅仅是一家之言,纯属个人感受。总之呢,玩蛇记这个系列就是用来专门记录python下工作的感想之用了。

在.NET下工作崇尚集成化,集成化的IDE,一体化的服务器,从操作系统到webserver,都是ms inside。非常适合初学者,啥都不用想,也没有太多让你选的。慢慢的能力提高了,就会觉得微软提供的东西不是那么完美,当你在开发的时候,很多东西如果不用微软内置的机制,就会让你费老大的力气去绕弯实现,比如DataGrid,很强大,但是大多数人都会在自己的blog离告诫后来者,还是回去用repeater吧,所见即所得的编辑器里面也因为各种为了妥协而加入的代码变得面目全非,直到后来的MVC的出现才勉强解决,不过以前在webform里积累的很多东西和技巧就付诸东流了。

在正式开篇前说了很多对.NET的不满,呵呵,小小偏题,幸亏博客园不是起点要按字数收钱。

话说回来,python很适合已经熟练掌握一种语言和平台的开发人员做拓展,比如已经熟练掌握java平台或者.NET的开发人员,当然更适合C和C++的开发人员来偶尔玩票一下Web开发。python好玩但并不是说它就是个漂亮的玩具,而是一种在linux,unix平台下非常具备生产力的语言。在很早的时候linux和bsd系统就默认内置python了,而现在很smart的ubuntu之类的很多集成的工具都是python编写的,而在web开发方面,估计是因为圈子小,而很多业余玩python的人大多不是正职搞Web开发的,所以国内用python开发Web的人不多。不过最近django之类的框架也出了书,虽然是沾了ROR的光,不过好歹也有人关注了。

其实python下最大的问题不是选择太少,恰恰是选择太多了,由于python的生产力实在是太强,要造个轮子的成本实在是很低,所以到处都是轮子,从Quixote,Django,web2py,web.py,karrigell……国内的还有uliweb……

绝对让你挑得眼花缭乱,也许是每个应用的需求各不相同,所以各个框架的出发点也各有分别,对初学者来说是眼花缭乱了,但是相对来说可选的范围也广了。还有一点和微软平台的区别就是,部署上也不是一体式的,IIS上架着.NET,这点其实是以前我非常眼热的。看着nginx,lighttpd这些新生代web server的让人心动的benchmark,再对比看着iis(那些标榜自己高performance的web server 在做对比测试的时候都不和iis一起比,不带一起玩的,不是一个等级……)

说到performance,我感觉自己有强烈的performance强迫症,看着跑得快的就眼热,所以就有了今天的猪脚-tornado,

这是一个facebook收购的一家叫friend feed的公司出品的框架,其实也是一款高性能的web server,纯python编写,开源,意味着我可以自己对其进行改进,且还有一个好处就是在文档异常缺乏的时候可以直接翻源码解决问题,事实证明这点非常有用,tornado的文档非常的缺乏,而且也没有api的说明,官网上的文档基本上等于就是把代码里的注释集中到了一起,不过还好python是如此的可爱,很多时候是靠着dir(object)来解决了问题。

由于facebook被和谐掉了,所以tornado的官网也未能幸免,其实python的下载页也被和谐掉了,不知道怎么回事,莫非是python.com造的孽?

祭上puff,直奔www.tornado.org,下载下来,解压,安装:

python setup.py install 

注意,必须在linux下安装,windows下没有epoll,所以用select代替了,非常的没效率,这点上twisted也是一般的光景。

由于tornado本身就是一个web server,所以自己就能单独运行。在用了2个星期后我感觉其实不安装,直接引用源码运行更好一些,很多时候可以方便自己对这个系统做点小改造。

安装后执行python,打开python shell,在其中输入 import tornado

回车后不报错就说明安装成功了

现在我们就可以用tornado来编写网站了,新建一个server.py

内容如下:

import tornado.httpserver
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

 

保存后,执行 python server.py

这个时候就能够通过浏览器看到 hello world的页面了

tornado和Django一样通过正则表达式的url mapping,不过有区别的是没有强制区分view和model,因为tornado虽然有一个简单的数据库封装,但是没有orm,幸好我对orm也不怎么感冒,且在python下orm确实也很鸡肋,而且真要用orm也能直接用现成的,真要自己写一个也很容易。模版系统也比较方便,不过没有集成Session,但是内部实现了一个安全cookie。不过现在很多系统都没用inproc的session了,所以就自己DIY了一个用memcached作为backend的Session出来。

这些东西我会在接下来的一系列POST里涉及到,因为没有写教程的打算,所以很多细节可能就点到即止了,更详细的相信愿意用这个玩意儿的也有这个能力去啃啃源代码,也就几千行。

另,tornado是一个单进程,单线程的Server,所以在每个RequestHandler的方法中的代码都是线程安全的。

很多人会有疑问,单进程单线程能快得快吗?其实事实胜于雄辩:

image

不过也由于这个特征,不能写一些延迟很大的操作,现在tornado暂时只支持用异步的curl,数据库操作暂时还是阻塞的,我正在研究增加一个异步的数据库操作模块来进一步提升其性能,如果有任何成果我会第一时间公布,也希望喜欢玩新鲜的蛇友同我交流

posted on 2010-03-20 01:02 亚历山大同志 阅读(4058) 评论(12) 编辑 收藏

评论

#1楼 2010-03-20 11:00 沙加      

相对来说我还是更看好js 的服务端应用一些~~  回复 引用 查看   

#2楼 2010-03-20 11:09 yyww      

js的服务端不过刚刚出现, 实在看不出来有啥好前途  回复 引用 查看   

#3楼[楼主] 2010-03-20 11:51 亚历山大同志      

clouddb那帮子人闹独立成立了一个cloudio,可以用js做服务端,有空就研究研究,其实对erlang还是很有爱  回复 引用 查看   

#4楼 2010-03-20 12:23 Jeffrey Zhao      

那些benchmark不带IIS一起玩是因为不care微软的东西,而不是不在一个档次上,MS Hater么。
测试过的都知道,IIS的性能非常好,他们万一加上IIS的话,被IIS一表现脸上要没光了。
我IIS是测试过的,并发,长链接,C20K等等,所以我现在对IIS的性能,传说中连接数量限制等等都非常有信心。
还有就是,我说IIS好话不代表我没玩过别的噢,我现在的主业就是有一大半就是在非Win下干的,呵呵。
比如你现在列出的这个benchmark,超过后4位是完全没有问题的,IIS的性能早就甩开Apache一截了。
如果脱离IIS,自己在.NET里用HttpListener写个轻量的Web Server,可能性能会更好一些,有机会要试试看……
其实很多时候Web Server性能差,只是做的事情多了一些。当然Nginx在这方面的确也非常精打细算。
还有这个兄弟看过没?http://www.javaeye.com/news/11355-c-erlang-java-go
 回复 引用 查看   

#5楼[楼主] 2010-03-20 13:18 亚历山大同志      

@Jeffrey Zhao
老赵依然是这么的矫健啊,呵呵
从纯性能来说IIS不能算差,遗憾就是不够轻量级,做了太多的事情,很多其实用户并不需要的。最大的问题是没法给他做瘦身,如果自己写轻量级的server,那轮子就造大了,费了老大功夫做个web server,轻量级的,多半性能也就和nginx半斤八两,还不如直接上nginx咯
不过这事老赵可以试试,windows下的完成端口比epoll理论上来说应该更先进,实际测试来说每秒连上几万个连接不是问题,但是能处理完多少那又是另说了,据JE上看到的说是有个play!的java框架,完全抛开了j2ee的模式,自己用mina实现自己的server,真是够疯狂的。
不过回过头来说,轻量级的东西用起来更加顺手,特别是带着源码裸奔的,就比如tornado,很多时候看文档还不如扒源码来得快当

ps,IIS的性能测试还真的很难在网上找到,有空得做一个试试
 回复 引用 查看   

#6楼 2010-03-20 13:51 Jeffrey Zhao      

@亚历山大同志
我一直想做,现在可能也有点机会,也想拉人来做,呵呵。
毕竟像Play这种纯Java能搞好的,凭啥用.NET就搞不好,对不对。
 回复 引用 查看   

#7楼[楼主] 2010-03-20 14:40 亚历山大同志      

@Jeffrey Zhao
如果要搞我参一个,5月份不怎么忙,正好有空搞
 回复 引用 查看   

#8楼 2010-03-20 18:51 大石头      

IIS的确不够轻量级,不过在.Net上,选择还是非常多的。

我现在做的一个系统,三层,客户端、中间服务器、主服务器,第一个版本呢,中间服务器和主服务器都是IIS,三方用WebService通讯。

因为中间服务器需要安装IIS,实施人员觉得很痛苦(几千上万个点),多次要求研发部门去掉IIS。

在第三个版本的时候,完全去掉了IIS,就是用老赵所说的HttpListener,那可是由核心驱动http.sys实现的,完全接管了原理IIS的功能,代码非常少(一两百行)。难道这还不够轻量级吗?
 回复 引用 查看   

#9楼 2010-03-20 18:54 大石头      

讨论平台和开发环境的性能意义不大,我就是用ASP.Net 2.0的WebService,四五台服务器,支撑着上百万的客户端(当然,少不了拿几千台中间服务器的缓冲)。

很多时候,不是工具不够好,而是使用者不够熟悉。

我不针对任何人,如果有说得不对的地方,还请见谅^_^
 回复 引用 查看   

#10楼 2010-03-22 10:13 lexus      

@沙加
js的服务端应用是指什么,comet吗,能不能指点一下
 回复 引用 查看   

#11楼 2010-03-22 11:39 沙加      

@lexus
有空了解一下Node.js 这个项目。
 回复 引用 查看   

#12楼 2010-05-18 16:30 双木成林      

www.tornado.org
这个地址是不对的..
应该是www.tornadoweb.org
 回复 引用 查看   

导航

公告


放一首适合飚车的音乐,听这个开车会不知不觉的加速
昵称:亚历山大同志
园龄:5年
荣誉:推荐博客
粉丝:116
关注:0
<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

搜索

 
 

常用链接

最新随笔

我的标签

随笔分类(128)

随笔档案(134)

相册

朋友的Blog

同事的Blog

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜