【问题标题】:HTTP Request TimeoutHTTP 请求超时
【发布时间】:2008-11-05 16:30:22
【问题描述】:

在 Python 2.6 中,向 httplib.HTTPConnection 类添加了一个新的“超时”参数: http://docs.python.org/library/httplib.html#httplib.HTTPConnection

但是,这只是连接到服务器的超时。我希望为 request 而不是连接设置超时值。 httplib 似乎不支持这个。

有没有办法模仿这种行为?

【问题讨论】:

标签: python http


【解决方案1】:

您可以设置全局套接字超时(*)

import socket

timeout = 10
socket.setdefaulttimeout(timeout)

(*)编辑:正如 cmets 中的人们正确指出的那样:这在技术上是正确的,但它仅对涉及单个套接字操作的任务具有可预测的结果.一个 HTTP 请求由多个套接字操作组成(例如 DNS 请求或其他可能从 HTTP 客户端抽象出来的东西)。因此,整个操作的超时变得不可预测。

【讨论】:

  • 如果我设置了套接字超时,那么所有从httplib发送的HTTP请求在我设置的值之后都会超时吗?
  • 提防 HTTPS 请求。由于 2.6.x bugs.python.org/issue5103 中的一个已知错误,客户端可能会无限期卡住(在 SSL 中的握手过程中忽略超时)
  • 这对我不起作用。它挂在 connection.request() 处。
  • @J.F.Sebastian 有道理。单个 HTTP 连接实际上可能涉及许多套接字阶段(即 DNS)。如果套接字超时为 10 秒,则指定主机名的完整 HTTP 请求可能需要更长的时间。 J.F. 声称完全超时需要 3 倍。查看他的链接。
【解决方案2】:

不,没有。

这是因为HTTP spec 没有为客户端提供任何东西来指定 HTTP 请求的生存时间信息。正如您所提到的,您只能在 TCP 级别执行此操作。

另一方面,服务器可能会使用 HTTP 状态代码 408 Request Timeout resp 通知客户端超时情况。 504 Gateway Timeout.

【讨论】:

    【解决方案3】:

    您还可以在连接的套接字上使用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

    【讨论】:

    • 据我所知,python 2.7 中的错误实际上是ssl.SSLError
    • 这不会为 connection.request() 设置超时。而且你不能将 connection.sock.settimeout(5.0) 上移一行,因为 connection.sock 是 None
    【解决方案4】:

    当您启动连接时,可以将超时值作为第三个参数。

    connection = HTTPConnection(<IP of URL>, <port or None>, <timeout>)
    ...
    

    是以秒为单位的浮点数。

    connection = HTTPConnection('slow.service.com', None, 20.0)
    

    【讨论】:

    • 这个问题是关于 Python 2.6,超时参数不可用。
    猜你喜欢
    • 2011-11-05
    • 2010-12-12
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2021-04-16
    • 2013-12-18
    相关资源
    最近更新 更多