MST

星途 面试题库

面试题:Python网络编程的并发优化

假设你需要使用Python的`asyncio`库,同时向多个(例如100个)不同的URL发起HTTP GET请求,并获取响应内容。这些URL存储在一个列表中。请阐述实现思路并给出核心代码片段,且要考虑如何处理请求超时和异常情况。
25.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 导入asyncio和用于HTTP请求的库,如aiohttp
  2. 定义一个函数,用于发起单个HTTP GET请求,并设置超时时间,处理可能的异常。
  3. 使用asyncio.gather并发执行多个请求。

核心代码片段

import asyncio
import aiohttp


async def fetch(session, url, timeout):
    try:
        async with session.get(url, timeout=timeout) as response:
            return await response.text()
    except (aiohttp.ClientError, asyncio.TimeoutError) as e:
        print(f"请求 {url} 时发生错误: {e}")
        return None


async def fetch_all(urls, timeout):
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url, timeout) for url in urls]
        results = await asyncio.gather(*tasks)
        return results


# 示例使用
urls = ["http://example.com"] * 100
timeout = aiohttp.ClientTimeout(total=10)
loop = asyncio.get_event_loop()
responses = loop.run_until_complete(fetch_all(urls, timeout))