限制Python3 urllib请求所花费的时间:超时不能按我的预期运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了限制Python3 urllib请求所花费的时间:超时不能按我的预期运行相关的知识,希望对你有一定的参考价值。

我试图抓住一个未解决的url给urllib请求。

import urllib.request

def getSite(url):
    try:
        with urllib.request.urlopen(url, timeout=2) as r:
            print(url, "was resolved!")
    except:
        print(url, "wasn't resolved...")
    return

我希望这会尝试连接到url,如果在2秒内没有响应,它会抛出错误并打印出它没有被解析。如果它在2秒内解决,它会相应地快速响应。这就是我想要发生的事情。我希望每个请求的持续时间不超过我开的时间。

就目前而言,使用有效的网址可以提供快速响应:

> getSite('http://stackoverflow.com')

> http://stackoverflow.com was resolved!
    real    0m0.449s
    user    0m0.063s
    sys     0m0.063s

但是,使用无效的URL需要的时间超过2秒:

> getSite('http://thisisntarealwebaddress.com')

> http://thisisntarealwebaddress.com wasn't resolved...
    real    0m18.605s
    user    0m0.063s
    sys     0m0.047s

什么是超时参数真正做的,我怎样才能得到我想要的结果?

文件:https://docs.python.org/3.1/library/urllib.request.html

答案

我通过在run_with_limited_time_function中使用this answer并运行我的函数来解决这个问题

run_with_limited_time_function(getSite, (url, ), {}, 2)

我还是想听听别人怎么说有关为什么timeout不按照我的预期工作的原因!


复制在这里是为了理智:

def run_with_limited_time(func, args, kwargs, time):
    """Runs a function with time limit

    :param func: The function to run
    :param args: The functions args, given as tuple
    :param kwargs: The functions keywords, given as dict
    :param time: The time limit in seconds
    :return: True if the function ended successfully. False if it was terminated.
    """
    p = Process(target=func, args=args, kwargs=kwargs)
    p.start()
    p.join(time)
    if p.is_alive():
        p.terminate()
        return False

    return True

以上是关于限制Python3 urllib请求所花费的时间:超时不能按我的预期运行的主要内容,如果未能解决你的问题,请参考以下文章

python3 urllib学习

Python 3.5.1 urllib 没有属性请求

python3中使用urllib进行https请求

python3之模块urllib

Python3网络爬虫——Urllib库的基本使用

python3爬虫之Urllib库