我正在实施一项从各种服务器获取网页的小服务。我需要能够配置不同类型的超时。我尝试使用settimeout
套接字方法,但它并不完全符合我的要求。这是问题所在。
我需要为初始DNS查找指定超时。我理解这是在我开始实例化HTTPConnection
时完成的。
我的代码是以这样的方式编写的,即我首先.read
一块数据(大约10 MB),如果整个有效负载都符合这一要求,我会转到代码的其他部分。如果它不适合这个,我直接将有效负载流出到文件而不是内存。当发生这种情况时,我会做一个无限制的.read()
来获取数据,如果远程端每秒向我发送一个数据字节,则连接只是等待每秒接收一个字节。我希望能够与“你花费太长时间”断开连接。基于线程的解决方案将是最后的手段。
答案 0 :(得分:1)
httplib
可以直接找到你要找的东西。
我建议您查看http://pycurl.sourceforge.net/和http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTTIMEOUT选项。
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPT_NOSIGNAL选项听起来也很有趣:
考虑构建具有c-ares支持的libcurl以启用异步DNS查找,这样可以在没有信号的情况下为名称解析提供良好的超时。
答案 1 :(得分:1)
您是否尝试过requests?
您可以方便地设置超时http://docs.python-requests.org/en/latest/user/quickstart/#timeouts
>>> requests.get('http://github.com', timeout=0.001)
编辑: 我错过了问题的第2部分。为此你可以使用它:
import sys
import signal
import requests
class TimeoutException(Exception):
pass
def get_timeout(url, dns_timeout=10, load_timeout=60):
def timeout_handler(signum, frame):
raise TimeoutException()
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(load_timeout) # triger alarm in seconds
try:
response = requests.get(url, timeout=dns_timeout)
except TimeoutException:
return "you're taking too long"
return response
并在您的代码中使用get_timeout
函数。
如果您需要超时可用于其他功能,您可以创建装饰器。 以上代码来自http://pguides.net/python-tutorial/python-timeout-a-function/。