在Python中设置HTTP响应读取方法的超时时间

1 投票
4 回答
4201 浏览
提问于 2025-04-15 21:12

我正在用Python做一个下载管理器,纯粹是为了好玩。有时候,虽然我和服务器的连接还在,但服务器却不再发送数据,这时候HTTPResponse的读取方法就会一直卡在那里,永远等下去。比如说,当我从一个位于国外的服务器下载文件时,可能因为他们限制了对其他国家的带宽,所以就会出现这种情况。

我该怎么给读取方法设置一个超时时间呢?比如说设置成2分钟?

谢谢,Nir。

4 个回答

1

设置默认的超时时间可能会导致下载在文件还没下载完的时候就提前中止,尤其是当文件很大的时候。这种情况和只在超时时间内没有收到数据才中止下载是不同的。使用HTTPlib2可能是个不错的选择。

3

如果你正在使用的Python版本低于 2.6,有一种方法可以尝试,虽然不完美但可以用。

import socket
socket.setdefaulttimeout(10.0)  # or whatever

在你开始使用 httplib 之前,先运行这个代码。相关的文档可以在这里找到,里面明确说明 setdefaulttimeout 从Python 2.3就开始提供了——从你调用这个函数的那一刻起,到你再次调用同样的函数之前,所有创建的socket都会使用这个10秒的超时时间。如果你想在设置新超时时间之前保存之前的超时时间(包括没有设置的情况),可以先用getdefaulttimeout来获取,这样你可以稍后用另一个 setdefaulttimeout 来恢复。

这些函数和用法在你需要使用一些较旧的高级库时非常有用,这些库使用Python的 socket,但没有提供设置超时的好方法(当然,使用更新的高级库更好,比如2.6版本自带的 httplib 或者第三方的 httplib2,但这并不总是可行,调整默认超时设置可以是一个不错的解决办法)。

2

你需要在HTTPConnection初始化的时候设置它。

注意:如果你使用的是较旧版本的Python,可以安装httplib2;很多人认为它比httplib更好用,而且它支持超时设置
不过我自己没有用过,只是根据文档和博客上的说法来告诉你。

撰写回答