MST

星途 面试题库

面试题:Python异步编程中如何使用asyncio提升性能

请阐述在Python中使用asyncio库进行异步编程时,创建异步任务、管理事件循环以及提升性能的基本流程和关键方法,并给出一个简单的示例代码说明。
44.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

创建异步任务

  1. 定义异步函数:使用 async def 关键字定义一个异步函数,这个函数内部通常会包含 await 关键字来暂停执行并等待一个可等待对象(如另一个异步函数)完成。
  2. 创建任务对象:使用 asyncio.create_task() 方法来创建一个任务对象,将异步函数包装成一个可以并发执行的任务。

管理事件循环

  1. 获取事件循环:在Python 3.7及以上版本,可以使用 asyncio.get_running_loop() 在协程内部获取当前的事件循环,或者使用 asyncio.get_event_loop() 在脚本顶层获取事件循环。在Python 3.10 及以上版本推荐使用 asyncio.run(),它会自动创建、运行和关闭事件循环。
  2. 运行事件循环:使用 loop.run_until_complete(task) 方法来运行事件循环,直到指定的任务完成。asyncio.run() 内部也是调用类似机制来运行事件循环并执行任务。
  3. 关闭事件循环:在使用完事件循环后,需要使用 loop.close() 方法关闭事件循环,不过 asyncio.run() 会自动处理关闭操作,所以通常在使用 asyncio.run() 时无需手动关闭。

提升性能的关键方法

  1. 减少阻塞操作:确保在异步函数内部,尽量避免长时间运行的同步(阻塞)代码,将阻塞操作替换为异步操作(如使用异步I/O库)。
  2. 并发执行任务:尽可能同时创建多个任务,利用事件循环的调度机制并发执行这些任务,提高整体效率。
  3. 合理设置并发数:对于一些外部资源(如网络连接数)有限的情况,合理设置并发任务的数量,避免资源耗尽。

示例代码

import asyncio


async def task_function():
    print('开始执行任务')
    await asyncio.sleep(2)
    print('任务执行完毕')


async def main():
    task = asyncio.create_task(task_function())
    print('任务已创建')
    await task
    print('所有任务已完成')


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

在上述代码中:

  1. task_function 是一个简单的异步函数,它打印一条消息,暂停2秒,然后再打印一条消息。
  2. main 函数中,首先使用 asyncio.create_task 创建了一个任务,然后使用 await 等待这个任务完成。
  3. asyncio.run(main()) 负责创建事件循环并运行 main 函数,执行整个异步流程。