Python异步IO——协程
核心概念
1.异步 I/O (Asynchronous I/O):一种非阻塞的 I/O 操作模式。当程序执行一个 I/O 操作(如网络请求、文件读写)时,它不会等待该操作完成,而是立即返回去执行其他任务。当 I/O 操作完成后,再回来处理结果。这极大地提高了程序的吞吐量和资源利用率。
2.协程 (Coroutine):一种比线程更轻量级的用户态线程,由程序员在代码中控制调度。它可以在执行过程中暂停(await
)让出 CPU,并在适当的时候恢复执行。协程是实现异步编程的基石。
3.事件循环 (Event Loop):异步编程的核心引擎。它不断地监听并执行各种任务(如协程、I/O 事件、回调函数),当一个任务等待 I/O 时,事件循环会挂起该任务并执行其他可运行的任务,从而实现单线程内的并发。
1. 定义协程
使用 async def
来定义一个协程函数:
import asyncioasync def my_coroutine():print("Hello")await asyncio.sleep(1) # 模拟一个异步I/O操作,睡眠1秒print("World")
2. 运行协程
使用 asyncio.run()
来运行一个协程:
asyncio.run(my_coroutine())
3. 创建任务
使用 asyncio.create_task()
将协程包装成一个 Task
对象,以便并发执行:
async def main():task1 = asyncio.create_task(my_coroutine())task2 = asyncio.create_task(my_coroutine())await task1await task2asyncio.run(main())
4. 并发执行多个协程
使用 asyncio.gather()
来同时运行多个协程,并等待它们全部完成:
async def main():await asyncio.gather(my_coroutine(),my_coroutine(),my_coroutine())asyncio.run(main())
以下代码展示了同步和异步方式处理多个网络请求的性能差异:
传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。
如果改用协程,生产者生产消息后,直接通过yield
跳转到消费者开始执行,待消费者执行完毕后,切换回生产者继续生产,效率极高: