Python:httplib的getresponse存在多个recv()调用问题

5

getresponse在读取HTML请求的标头时会发出许多recv调用。事实上,它为每个字节发出recv,从而导致许多系统调用。如何进行优化?

我在Ubuntu机器上使用strace进行了验证。

示例代码:

conn = httplib.HTTPConnection("www.python.org")
conn.request("HEAD", "/index.html")
r1 = conn.getresponse()

strace转储:

sendto(3, "HEAD /index.html HTTP/1.1\r\nHost:"..., 78, 0, NULL, 0) = 78
recvfrom(3, "H", 1, 0, NULL, NULL)      = 1
recvfrom(3, "T", 1, 0, NULL, NULL)      = 1
recvfrom(3, "T", 1, 0, NULL, NULL)      = 1
recvfrom(3, "P", 1, 0, NULL, NULL)      = 1
recvfrom(3, "/", 1, 0, NULL, NULL)      = 1
...
1个回答

3
r = conn.getresponse(buffering=True)

在Python 3.1及以上版本中,没有buffering参数(它是默认的)。

我用urllib2.urlopen获取数据时,发现recvfrom()只读取单个字节,而且非常频繁。我发现,在urllib2内部使用HTTPConnection,但在getreponse()调用中没有传递任何参数。有没有办法消除大量的小recvfrom()? - Andrei Belov
@AndreiBelov 你尝试过直接使用HTTPConnection并将 buffering=True 传递给它的 getresponse() 方法吗? - jfs
@J.F.Sebastian,不幸的是这不是一个选项。我刚刚发现urllib2仅针对响应头读取1字节块,即当服务器开始以分块编码发送正文时,情况会变得更好: 323 recvfrom(3, "\r", 1, 0, NULL, NULL) = 1 324 recvfrom(3, "\n", 1, 0, NULL, NULL) = 1 325 recvfrom(3, "<!DOCTYPE html>\n<html lang="en-U"..., 8192, 0, NULL, NULL) = 8192 - Andrei Belov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接