关于settimeout:python httplib的各种超时

Various timeouts for python httplib

我正在实现一个从各种服务器获取网页的小服务。我需要能够配置不同类型的超时。我尝试使用settimeout套接字方法来解决这个问题,但这并不像我想的那样。这是问题所在。

  • 我需要为初始DNS查找指定超时。我明白这是在我开始实例化HTTPConnection时完成的。

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


  • 你试过请求吗?

    您可以方便地设置超时http://docs.python-requests.org/en/latest/user/quickstart/#timeouts

    1
    >>> requests.get('http://github.com', timeout=0.001)

    编辑:
    我错过了问题的第2部分。 为此你可以使用这个:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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/。


    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选项听起来也很有趣:

    Consider building libcurl with c-ares support to enable asynchronous DNS lookups, which enables nice timeouts for name resolves without signals.