Python的urllib2支持连接池吗?

1 投票
1 回答
1017 浏览
提问于 2025-04-17 03:22

我想知道的是,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实例。

撰写回答