python request timeout_关于python:HTTP请求超时

在Python 2.6中,一个新的"timeout"参数被添加到httplib.HTTPConnection类中:

http://docs.python.org/library/httplib.html#httplib.HTTPConnection

但是,这只是连接到服务器的超时。 我期待为请求设置超时值,而不是连接。 httplib似乎不支持这一点。

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

related:使用urllib2或任何其他http库读取超时

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

1

2

3

4import socket

timeout = 10

socket.setdefaulttimeout(timeout)

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

如果我设置了套接字超时,那么在我设置的值之后,从httplib发送的所有HTTP请求都会超时吗?

这应该会影响所有套接字操作。

注意HTTPS请求。由于2.6.x bugs.python.org/issue5103中的已知错误,客户端可能会被无限期卡住(在SSL的握手过程中会忽略超时)

@GabiMe我不认为这是Python 2.6.1的问题。我检查了ssl.py代码,它看起来不像bug报告中的代码。

这对我不起作用。它挂在connection.request()上。

@Mark文档说(强调我的)"设置新套接字对象的默认超时(以秒为单位)(浮点数)。"

@MarkLakata:HTTPConnection.request不尊重超时?

@ J.F.Sebastian有一点意见。单个HTTP连接实际上可能涉及许多套接字阶段(即DNS)。如果套接字超时为10秒,则指定主机名的完整HTTP请求可能需要更长时间。 J.F.声称完全超时需要3倍。看他的链接。

@MarkLakata我同意。鉴于这个答案真的很古老......我们如何进行?编辑?要求OP接受另一个?将问题标记为重复?

我只是用最新信息编辑你的答案。

@Mark Done。如果您有需要添加的内容,请随时编辑。

@MarkLakata:在我的例子中需要15倍(不是3倍)。原因不是由于制作单个DNS请求所花费的时间,原因是单个主机名可能对应于依次依次尝试(连接)的多个IP地址(尝试的时间越长,ips越多) 。它对于google.com主机名更为突出,因为它对应于许多ips。

@ J.F.Sebastian我花了30秒钟,除以10秒钟得到3x。

@MarkLakata:超时= 2(秒):30/2 = 15x

不,没有。

这是因为HTTP规范没有为客户端提供任何指定HTTP请求的生存时间信息的内容。如上所述,您只能在TCP级别执行此操作。

另一方面,服务器可以通过HTTP状态代码408 Request Timeout resp来通知客户端超时情况。 504网关超时。

您还可以在连接的套接字上使用settimeout(适用于Python 2.5):

1

2

3

4

5

6connection = 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

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

1

2connection = HTTPConnection(, , )

...

是一个浮动秒。

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

这个问题是关于Python 2.6的,其中超时arg不可用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值