【发布时间】:2008-11-05 16:30:22
【问题描述】:
在 Python 2.6 中,向 httplib.HTTPConnection 类添加了一个新的“超时”参数: http://docs.python.org/library/httplib.html#httplib.HTTPConnection
但是,这只是连接到服务器的超时。我希望为 request 而不是连接设置超时值。 httplib 似乎不支持这个。
有没有办法模仿这种行为?
【问题讨论】:
在 Python 2.6 中,向 httplib.HTTPConnection 类添加了一个新的“超时”参数: http://docs.python.org/library/httplib.html#httplib.HTTPConnection
但是,这只是连接到服务器的超时。我希望为 request 而不是连接设置超时值。 httplib 似乎不支持这个。
有没有办法模仿这种行为?
【问题讨论】:
您可以设置全局套接字超时(*):
import socket
timeout = 10
socket.setdefaulttimeout(timeout)
(*)编辑:正如 cmets 中的人们正确指出的那样:这在技术上是正确的,但它仅对涉及单个套接字操作的任务具有可预测的结果.一个 HTTP 请求由多个套接字操作组成(例如 DNS 请求或其他可能从 HTTP 客户端抽象出来的东西)。因此,整个操作的超时变得不可预测。
【讨论】:
不,没有。
这是因为HTTP spec 没有为客户端提供任何东西来指定 HTTP 请求的生存时间信息。正如您所提到的,您只能在 TCP 级别执行此操作。
另一方面,服务器可能会使用 HTTP 状态代码 408 Request Timeout resp 通知客户端超时情况。 504 Gateway Timeout.
【讨论】:
您还可以在连接的套接字上使用settimeout(适用于 Python 2.5):
connection = HTTPConnection('slow.service.com')
connection.request(...)
connection.sock.settimeout(5.0)
response = connection.getresponse()
response.read()
connection.close()
如果服务器无法在 5 秒内发送响应,则会引发 socket.error。
【讨论】:
ssl.SSLError
当您启动连接时,可以将超时值作为第三个参数。
connection = HTTPConnection(<IP of URL>, <port or None>, <timeout>)
...
是以秒为单位的浮点数。
connection = HTTPConnection('slow.service.com', None, 20.0)
【讨论】: