Python 的一些网络库(感谢Arbow)

来自:http://hi.baidu.com/arbow/blog/item/6cfcd13bcc8056ed15cecbc1.html

 一直在想,要是Stackless实现的Web Server中要实现反向代理,该怎么办。Http请求是绝对不能阻塞的,不然就没有意义了。

结果给我找到两个库:

1.stacklesssocket

http://stacklessexamples.googlecode.com/svn/trunk/examples/networking/stacklesssocket.py

主要使用了asyncore库,将原先需要阻塞的socket库调用改成了异步。

2. httplib2

http://code.google.com/p/httplib2/

与python标准库里面的urllib2,httplib相比,这玩意主要支持Keep-Alive!在大量请求时,可以复用连接,可以节省很多系统开销。

随手改了下张教主的代码(http://zsp.javaeye.com/blog/261132)

import stackless 

import stacklesssocket 

stacklesssocket.install() 

import urllib2, httplib, httplib2

LOOP = 1000

def test_urllib2(i): 

   print "urllib2 test", i 

   for i in xrange(0, LOOP):

       urllib2.urlopen("http://www.youdao.com").read()[:80]

   print "urllib2 test", i , "finished"

def test_http(i):

   print "http test", i

   for i in xrange(0, LOOP):

       conn = httplib.HTTPConnection("www.youdao.com")

       conn.request("GET", "/")

       conn.getresponse().read()[:80]

       conn.close()

def test_http2(i):

   print "httplib2 test", i

   http = httplib2.Http()

   for i in xrange(0, LOOP):

       resp, content = http.request("http://www.youdao.com/")

       #print content[:80]

for i in range(5): 

   #stackless.tasklet(test_urllib2)(i)

   stackless.tasklet(test_http2)(i)

stackless.run() 

跑了下,使用urllib2/httplib时,客户端的网络端口不停更换,流量达到几十K,在使用httplib2时,就那5个连接,流量只有10K左右。两者的处理时间基本接近,可以认为网络延迟不高,因此多出来的N*3次握手所占时间不多。

好了,有了这2个库,世界更加美好了,接下来可以做一些好玩的东东:D

3.http://pynetlibs.sourceforge.net/default.html 

4.http://code.google.com/p/tinynl/ 

posted @ 2011-07-21 21:05  vily_雷  阅读(1313)  评论(0)    收藏  举报