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

利用concurrent.futures._base实现并发网络请求

发布时间:2023-12-31 21:46:26

在Python中,并发网络请求可以通过concurrent.futures._base模块实现。concurrent.futures._base提供了ThreadPoolExecutor类和ProcessPoolExecutor类,分别用于创建线程池和进程池,以实现并发执行网络请求的功能。

下面是一个使用concurrent.futures._base模块实现并发网络请求的示例:

import concurrent.futures
import requests

# 需要请求的url列表
urls = [
    'https://www.example.com',
    'https://www.google.com',
    'https://www.github.com',
    # ...
]

def fetch(url):
    try:
        response = requests.get(url)
        return response.text
    except requests.exceptions.RequestException as e:
        return str(e)

# 创建一个线程池,最大并发数为10
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
    # 使用map方法将fetch函数应用于urls列表中的每个url,并发执行网络请求
    # 返回值是一个迭代器,可以使用list函数转换为列表
    responses = executor.map(fetch, urls)

    # 遍历并处理请求结果
    for url, response in zip(urls, responses):
        if isinstance(response, str):
            print(f"Failed to fetch {url}: {response}")
        else:
            print(f"Fetched {url}: {response[:100]}...")

上述示例中,首先定义了一个需要请求的url列表。然后定义了一个fetch函数,用于发送网络请求并返回响应文本。在主程序中,使用ThreadPoolExecutor创建一个线程池,最大并发数为10。然后使用map方法将fetch函数应用于urls列表中的每个url,并发执行网络请求。返回值是一个迭代器,可以使用for循环依次处理每个请求的结果。

需要注意的是,如果你需要执行密集型计算任务,可以使用concurrent.futures.ProcessPoolExecutor来创建进程池,并使用与上述示例类似的方式实现并发网络请求。但是,由于进程间通信的开销,进程池通常比线程池慢一些。

使用concurrent.futures._base模块可以方便地实现并发网络请求,充分利用多线程或多进程的优势,提高网络请求的效率。