面试题答案
一键面试创建异步任务
- 定义异步函数:使用
async def
关键字定义一个异步函数,这个函数内部通常会包含await
关键字来暂停执行并等待一个可等待对象(如另一个异步函数)完成。 - 创建任务对象:使用
asyncio.create_task()
方法来创建一个任务对象,将异步函数包装成一个可以并发执行的任务。
管理事件循环
- 获取事件循环:在Python 3.7及以上版本,可以使用
asyncio.get_running_loop()
在协程内部获取当前的事件循环,或者使用asyncio.get_event_loop()
在脚本顶层获取事件循环。在Python 3.10 及以上版本推荐使用asyncio.run()
,它会自动创建、运行和关闭事件循环。 - 运行事件循环:使用
loop.run_until_complete(task)
方法来运行事件循环,直到指定的任务完成。asyncio.run()
内部也是调用类似机制来运行事件循环并执行任务。 - 关闭事件循环:在使用完事件循环后,需要使用
loop.close()
方法关闭事件循环,不过asyncio.run()
会自动处理关闭操作,所以通常在使用asyncio.run()
时无需手动关闭。
提升性能的关键方法
- 减少阻塞操作:确保在异步函数内部,尽量避免长时间运行的同步(阻塞)代码,将阻塞操作替换为异步操作(如使用异步I/O库)。
- 并发执行任务:尽可能同时创建多个任务,利用事件循环的调度机制并发执行这些任务,提高整体效率。
- 合理设置并发数:对于一些外部资源(如网络连接数)有限的情况,合理设置并发任务的数量,避免资源耗尽。
示例代码
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())
在上述代码中:
task_function
是一个简单的异步函数,它打印一条消息,暂停2秒,然后再打印一条消息。main
函数中,首先使用asyncio.create_task
创建了一个任务,然后使用await
等待这个任务完成。asyncio.run(main())
负责创建事件循环并运行main
函数,执行整个异步流程。