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异常,我们可以通过捕获这个异常来处理超时的情况。在例子中,我们简单地打印出了超时的消息。
最后,我们将所有任务的结果收集起来,返回给主函数。这样就实现了在一定时间内控制爬虫程序的执行时间,并处理了超时的情况。
