Python的urllib2支持连接池吗?
我想知道的是,Python的urllib2更像Java的HttpUrlConnection
,还是更像Apache的HttpClient
?最终我想了解的是,当在HTTP服务器中使用urllib2时,它的性能是否能跟得上,或者是否有其他库在性能成为问题时会被使用(就像在Java的世界里一样)。
为了更详细地说明我的问题:
Java的HttpUrlConnection在内部每个主机只保持一个连接,并且会进行管道处理。所以如果你在多个线程中同时执行以下操作,它的表现就不会很好:
HttpUrlConnection cxn = new Url('www.google.com').openConnection();
InputStream is = cxn.getInputStream();
相比之下,Apache的HttpClient可以通过连接池来初始化,像这样:
// this instance can be a singleton and shared across threads safely:
HttpClient client = new HttpClient();
MultiThreadedHttpConnectionManager cm = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams p = new HttpConnectionManagerParams();
p.setMaxConnectionsPerHost(HostConfiguration.ANY_HOST_CONFIGURATION,20);
p.setMaxTotalConnections(100);
p.setConnectionTimeout(100);
p.setSoTimeout(250);
cm.setParams(p);
client.setHttpConnectionManager(cm);
上面例子中重要的一点是,总连接数和每个主机的连接数都是可以配置的。
在一个评论中提到了urllib3,但我从文档中看不出来它是否允许设置每个主机的最大连接数。
1 个回答
0
截至Python 2.7.14rc1,答案是否定的。
在urllib
中,urlopen()
最终会调用 httplib.HTTP
,而这个调用会 创建一个新的HTTPConnection
实例。HTTPConnection
是和一个网络连接(socket)相关联的,它有一些方法可以用来打开和关闭这个连接。
在urllib2
中,HTTPHandler
做了类似的事情,同样创建了一个新的HTTPConnection
实例。