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/

浙公网安备 33010602011771号