欢迎访问宙启技术站
智能推送

Python中的TimeoutError()异常是什么时候抛出的

发布时间:2024-01-12 04:25:13

TimeoutError()异常是在多线程或多进程编程中,当一个操作超过了规定的时间限制,而没有得到期望的结果时抛出的异常。TimeoutError()异常通常用于控制并发操作的执行时间,比如网络请求、文件读写等等。

下面是一个使用例子,假设我们有一个爬虫程序,需要从多个网站上获取数据,每个网站请求的时间都是不确定的,我们希望程序在一定时间内能够获取足够的数据,并控制程序的执行时间,以防止某一个网站请求过长导致整个程序执行时间过长。

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
from concurrent.futures import TimeoutError

# 定义一个任务函数,模拟请求一个网站并返回结果
def fetch(url):
    try:
        response = requests.get(url, timeout=5)  # 设置请求超时时间为5秒
        return response.text
    except Exception as e:
        print("Request failed:", e)
        return None

# 定义一个爬虫函数,使用线程池来执行多个任务
def spider():
    urls = [
        "http://www.example1.com",
        "http://www.example2.com",
        "http://www.example3.com",
        # 更多网站链接...
    ]
    results = []

    with ThreadPoolExecutor(max_workers=5) as executor:
        # 提交任务到线程池,并等待任务完成
        # 设置超时时间为5秒
        futures = [executor.submit(fetch, url) for url in urls]
        for future in as_completed(futures, timeout=5):  # 控制整个爬虫程序的运行时间为5秒
            try:
                result = future.result()  # 获取任务执行结果
                if result:
                    results.append(result)
            except TimeoutError as e:
                print("Timeout:", e)

    return results

if __name__ == "__main__":
    result = spider()
    print(result)

在上面的例子中,我们使用了requests库发送网络请求,使用ThreadPoolExecutor来创建一个线程池,并使用submit()方法将任务提交到线程池中执行。每个任务都是一个网站请求,通过fetch()函数发送请求并返回结果。

as_completed()函数中,我们可以设置一个总的超时时间,如果某一个任务执行超过了这个时间限制,就会抛出TimeoutError异常,我们可以通过捕获这个异常来处理超时的情况。在例子中,我们简单地打印出了超时的消息。

最后,我们将所有任务的结果收集起来,返回给主函数。这样就实现了在一定时间内控制爬虫程序的执行时间,并处理了超时的情况。