Tornado  - 讨论区

标题:[转载]试用Tornado的非阻塞功能(一个客户端异步例子)

2011年01月12日 星期三 09:51


如果对“非阻塞”还不太明白的童鞋,可以先看下之前的一篇 《PHP中实现非阻塞模式》

Tornado由Python编写,是一款轻量级的Web服务器,同时又是一个开发框架。

采用非阻塞I/O模型(epoll),主要是为了应对高并发访问量而被开发出来,尤其适用于comet应用。

简单介绍就这样吧,预知详情请自行翻墙到其官网  www.tornadoweb.org  了解。

翻墙?米错,翻墙!因为他的东家是早被我朝和谐掉的大名鼎鼎的——“非死不可”~

2009年9月11日,Facebook的网站发布了Tornado,基于Python构架采用了Apache 2.0许可证。

Facebook声称,Tornado支持实时定位功能的内嵌式FriendFeed。

该软件比较简单,但是可以大规模不间断地处理成千上万个并发事务。

python中支持非阻塞的网络开发框架很多,目前重量级的老大应该算是 Twisted ,也正由于其的重量级,以至于O'Reilly有一本书来专门介绍。算了,学习成本较高,暂不考虑吧~

先扯到这里吧,下面进入正题

我的环境:ubuntu 10.04 + Python 2.6

没有装一下包的先装下

sudo apt-get install python-dev python-pycurl python-simplejson

然后下载安装tornado

tar xvzf tornado-0.2.tar.gz

cd tornado-0.2

python setup.py build

sudo python setup.py install

我的测试Demo:

  • test.php  服务端
  • asyn_test.py  客户端1——非阻塞测试
  • sync_test.py  客户端2——阻塞测试(对比效果用)

test.php

 

  1. $timeout  = isset( $_GET [ 's' ]) ? (int) $_GET [ 's' ] : 0;  
  2. sleep( $timeout );  
  3. echo   "S:" . $timeout ;  
 

 

根据url中参数,进行延迟。

asyn_test.py

 

  1. import  time  
  2. import  tornado.ioloop as ioloop  
  3. import  tornado.httpclient as httpclient  
  4. start = time.time()  
  5. step =  3 ;  
  6. def  handle_request(response):  
  7.      global  step  
  8.      if  response.error:  
  9.          print   "Error:" , response.error  
  10.      else :  
  11.          print  response.body  
  12.     step -=  1 ;  
  13.      if   not  step:  
  14.         finish()  
  15. def  finish():  
  16.      global  start  
  17.     end = time.time()  
  18.      print   "Used %0.2f secend(s)"  % float(end - start)  
  19.     ioloop.IOLoop.instance().stop()  
  20. http_client = httpclient.AsyncHTTPClient()  
  21. http_client.fetch( "http://192.168.1.73/test.php?s=1" , handle_request)  
  22. http_client.fetch( "http://192.168.1.73/test.php?s=2" , handle_request)  
  23. http_client.fetch( "http://192.168.1.73/test.php?s=3" , handle_request)  
  24. ioloop.IOLoop.instance().start()  
 

 

sync_test.py

 

  1. import  time  
  2. import  tornado.httpclient as httpclient  
  3. start = time.time()  
  4. def  finish():  
  5.      global  start  
  6.     end = time.time()  
  7.      print   "Used %0.2f secend(s)"  % float(end - start)  
  8. http_client = httpclient.HTTPClient()  
  9. try :  
  10.     response = http_client.fetch( "http://192.168.1.73/test.php?s=1" )  
  11.      print  response.body  
  12.     response = http_client.fetch( "http://192.168.1.73/test.php?s=2" )  
  13.      print  response.body  
  14.     response = http_client.fetch( "http://192.168.1.73/test.php?s=3" )  
  15.      print  response.body  
  16. except  httpclient.HTTPError, e:  
  17.      print   "Error:" , e  
  18. finish()  
 

 

分别运行测试

 

linvo@ubuntu:~/lab/python$ python asyn_test.py 

S:1

S:2

S:3

Used 3.02 secend(s)

linvo@ubuntu:~/lab/python$ python sync_test.py 

S:1

S:2

S:3

Used 6.02 secend(s)

 

效果很明显,不是么:)

转载来源: http://blog.csdn.net/linvo/archive/2010/08/06/5793764.aspx

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号