为什么套接字实现比请求慢?

2024-09-25 00:35:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python3.4脚本来获取多个web页面。起初,我使用请求库获取页面:

def get_page_requsets(url):
    r = requests.get(url)
    return r.content

上面的代码给出了每秒4.6个请求的平均速度。 为了提高速度,我重写了函数以使用套接字库:

^{pr2}$

平均速度下降到每秒4.04个请求。我不希望提高速度,但希望略有提高,因为插座是较低水平。 是图书馆的问题还是我做错了什么?在


Tags: 函数代码脚本weburlgetreturndef
2条回答

requests使用^{},它非常有效地处理HTTP连接。尽可能重复使用同一服务器的连接,从而节省套接字连接和拆卸成本:

  • Re-use the same socket connection for multiple requests, with optional client-side certificate verification. See: HTTPConnectionPool and HTTPSConnectionPool

此外,urllib3requests向服务器通告它们可以处理压缩的响应;通过压缩,您可以在相同的时间内传输更多的数据,从而导致每秒更多的请求。在

  • Supports gzip and deflate decoding. See: decode_gzip() and decode_deflate()

urllib3也使用套接字(尽管是通过^{} module);重新设计这个轮子没有什么意义。也许您应该考虑使用线程或多处理或eventlets并行获取url;requests作者有一个{a3}可以帮助您。在

慢可能是因为你做了错误的HTTP:发出HTTP/1.1请求,甚至显式地指定connectionkeep-alive(甚至不需要,因为这在HTTP/1.1中是隐式的)。但是,您只需从套接字读取,并期望服务器在请求完成后关闭连接。但是服务器不会这样做,它会等待更多的请求,因为它会保持活动状态,并且只有在一段时间的非活动状态之后才会关闭连接,这取决于服务器的配置。你很幸运地连接到一个超时时间很短的服务器,在那里你每秒钟仍能收到4.04个请求,而在其他服务器上,你的代码每分钟只有几个请求。在

如果您想用普通套接字发出一个简单的HTTP请求,请使用HTTP/1.0,而不要使用keep-alive。然后你可以一直读到服务器关闭,你也不必处理HTTP/1.1中引入的分块传输编码。您也不必处理压缩编码,因为您不明确接受它们(但一些损坏的服务器无论如何都会发送它们)。在

但是,虽然这将使您的代码比现在更快,但它不会像请求那样快,因为所有这些保持活动、压缩等都是为了提高速度而添加的。要正确地重新实现所有这些并不容易,所以我建议您继续使用请求库。在

相关问题 更多 >