1

我正在实现一个从各种服务器获取网页的小服务。我需要能够配置不同类型的超时。我已经尝试过使用settimeout套接字的方法,但这并不完全符合我的意愿。这是问题所在。

  1. 我需要为初始 DNS 查找指定超时。我知道这是在我HTTPConnection开始实例化时完成的。

  2. 我的代码是以这样一种方式编写的,我首先.read是一大块数据(大约 10 MB),如果整个有效负载都适合这个,我会继续处理代码的其他部分。如果它不适合这个,我直接将有效负载流式传输到文件而不是内存中。发生这种情况时,我会无限制.read()地获取数据,如果远程端每秒向我发送一个字节的数据,则连接只会等待每秒接收一个字节。我希望能够与“你花了太长时间”断开连接。基于线程的解决方案将是最后的手段。

4

2 回答 2

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 查找,这可以在没有信号的情况下为名称解析提供很好的超时。

于 2012-04-26T07:06:28.730 回答
1

您是否尝试过请求

您可以方便地设置超时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/

于 2012-05-01T12:05:59.107 回答