MST
星途 面试题库

面试题:Python异步IO的性能优化

在一个包含大量异步任务(比如1000个)的Python项目中,使用asyncio库,每个任务都是一个模拟的网络请求(通过`asyncio.sleep`模拟延迟)。请阐述可能会遇到哪些性能问题,如何通过调整异步任务的并发数量、资源分配等方式进行性能优化,并给出优化后的代码示例。
15.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

可能遇到的性能问题

  1. 资源耗尽:如果并发数量过高,可能会耗尽系统资源,如文件描述符、内存等,导致程序崩溃或性能急剧下降。
  2. 网络拥塞:过多的网络请求同时发送,可能会导致网络拥塞,使得每个请求的响应时间变长。
  3. 系统负载过高:大量并发任务会使CPU和内存的负载增加,影响系统整体性能。

性能优化方式

  1. 调整并发数量:通过设置合适的并发数,避免资源过度使用。可以根据系统资源情况(如CPU核心数、内存大小)和网络带宽来调整。
  2. 资源分配:合理分配资源,如为每个任务分配适当的内存空间,避免内存泄漏和过度占用。

优化后的代码示例

import asyncio


async def mock_network_request(delay):
    await asyncio.sleep(delay)
    return f"Request with delay {delay} completed"


async def main():
    tasks = []
    max_concurrency = 100  # 设置最大并发数
    semaphore = asyncio.Semaphore(max_concurrency)

    for i in range(1000):
        async def task_wrapper(delay):
            async with semaphore:
                return await mock_network_request(delay)

        task = asyncio.create_task(task_wrapper(i / 10))
        tasks.append(task)

    results = await asyncio.gather(*tasks)
    for result in results:
        print(result)


if __name__ == "__main__":
    asyncio.run(main())

在上述代码中,使用asyncio.Semaphore来限制并发数量为100,避免资源过度使用。每个异步任务在获取信号量后执行模拟的网络请求,完成后释放信号量,使得其他任务可以获取信号量并执行。这样可以有效控制并发数量,优化性能。