使用concurrent.futures.threadThreadPoolExecutor()实现多线程网络请求
发布时间:2023-12-15 06:03:32
concurrent.futures模块提供了线程池和进程池,可以方便地实现多线程和多进程的并发处理任务。其中,concurrent.futures.threadThreadPoolExecutor()方法可以用来创建一个线程池,通过将任务提交给线程池来实现多线程的网络请求。
下面是一个使用concurrent.futures.threadThreadPoolExecutor()实现多线程网络请求的例子:
import concurrent.futures
import requests
# 定义一个函数,用于发送网络请求
def send_request(url):
response = requests.get(url)
print(f"Response from {url}: {response.status_code}")
# 定义一个列表,用于存储需要请求的URL
urls = ['https://www.example.com', 'https://www.google.com', 'https://www.bing.com']
# 创建一个线程池,指定最大线程数为5
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
# 使用submit()方法提交任务给线程池,并返回一个Future对象
future_to_url = {executor.submit(send_request, url): url for url in urls}
# 使用as_completed()方法获取已完成的任务的返回结果
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
# 获取任务的返回结果
result = future.result()
except Exception as e:
print(f"{url} generated an exception: {str(e)}")
else:
print(f"{url} success")
在上述代码中,我们首先导入了concurrent.futures和requests模块。然后,定义了一个send_request()函数,用于发送网络请求。接着,我们创建了一个列表urls,其中包含了需要请求的URL。
接下来,我们通过 concurrent.futures.ThreadPoolExecutor(max_workers=5) 创建一个线程池,指定最大线程数为5。然后使用 submit() 方法将任务提交给线程池,并返回一个Future对象。我们使用一个字典 future_to_url 来将每个Future对象与对应的URL关联起来。
在调用 as_completed() 方法时,会返回一个迭代器,用于获取已完成的任务的返回结果。在迭代过程中,如果任务执行过程中发生了异常,我们会捕获并打印出来。否则,我们则会输出请求的URL和成功的信息。
最后,我们使用 with 语句管理了线程池的生命周期,确保在任务执行完毕后正确地关闭线程池。
这样,我们就通过 concurrent.futures.threadThreadPoolExecutor() 方法实现了一个简单的多线程网络请求的例子。我们可以轻松地通过调整最大线程数来控制并发度,提高网络请求的效率。
