真正令我疑惑的是:python的urllib2更像是java的HttpUrlConnection
,还是更像是apache的HttpClient
?并且,最终我想知道urllib2在http服务器中使用时是否会扩展,或者在性能出现问题时是否存在一些备用库(如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,但是我无法通过阅读文档告诉它是否允许设置每个主机的最大值。
答案 0 :(得分:0)
从Python 2.7.14rc1开始,否。
对于urllib
中eventually calls httplib.HTTP
的urlopen()
,HTTPConnection
creates a new instance。 HTTPConnection
绑定到套接字,并具有用于打开和关闭该套接字的方法。
对于urllib2
,HTTPHandler
does something similar,并创建HTTPConnection
的新实例。