当前位置:  开发笔记 > 编程语言 > 正文

HTTP请求超时

如何解决《HTTP请求超时》经验,为你挑选了3个好方法。

在Python 2.6中,一个新的"timeout"参数被添加到httplib.HTTPConnection类:http://docs.python.org/library/httplib.html#httplib.HTTPConnection

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

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



1> Tomalak..:

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

import socket

timeout = 10
socket.setdefaulttimeout(timeout)

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


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

2> mkoeller..:

不,没有.

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

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



3> Pankrat..:

您也可以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则会引发响应.


这不会为connection.request()设置超时.而且你不能将connection.sock.settimeout(5.0)向上移动一行,因为connection.sock是None
推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有