asyncio — Asynchronous I/O

asyncio — Asynchronous I/O #

https://docs.python.org/3.13/library/asyncio.html

asyncio是用来编写并发代码的库,使用async/await语法。

asyncio被用作多个提供高性能Python异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。

asyncio往往是构建IO密集型和高层级结构化网络代码的最佳选择。

asyncIO是Python并发编程的最新技术。它结合future和事件循环的概念,引入了协程。这是一种非常优雅和易于理解的编写响应式程序的方法,不会浪费时间等待输入或其他I/O操作。

使用asyncio可以在单个线程中实现多任务交替处理。

协程(coroutine) #

协程(coroutine)是一个函数,它需要某些事件发生才能执行,它也可以向其他协程发送事件。

使用async def来实现协程。async的函数必须运行在事件循环(event loop)的上下文中。事件循环基于发生的事件在多个协程之间切换控制权。

 1import asyncio
 2
 3
 4async def main():
 5    print("hello")
 6    # 不能使用time.sleep(1),因为它时阻塞的,会夺取控制权阻塞事件循环
 7    # 使用asyncio.sleep(1),await表示事件循环可以在等待sleep时将控制权切换给另一个协程
 8    await asyncio.sleep(1)
 9    print("world")
10
11# 启动事件循环,执行main()协程
12asyncio.run(main())

代码执行遇到await时表明当前协程进入等待状态,事件循环可以把控制权切换给另一个协程函数。

async操作并非并行执行,而是交替执行。在任何时刻,最多只有一个协程拥有控制权,处于执行状态,所有其他协程都在等待事件发生。交替执行的思想可以被描述为协同多任务:一个程序可以在处理数据的同时等待下一个请求消息的到来。当数据可用时,事件循环可以将控制权转交给某一个正在等待的协程。

AsyncIO偏向网络I/O。大多数网络程序,尤其是服务器,会花费大量时间等待网络传输的数据。AsyncIO可能比使用多线程处理每个客户端请求更有效,使用多线程会造成有些线程在工作而有些线程在等待,可能会耗尽内存和其他资源。而AsyncIO是单线程的,当数据可用时,它使用协程来交替处理网络数据。

AsyncIO偏向网络I/O。大多数网络程序,尤其是服务器,会花费大量时间等待网络传输的数据。AsyncIO可能比使用多线程处理每个客户端请求更有效,使用多线程会造成有些线程在工作而有些线程在等待,可能会耗尽内存和其他资源。而AsyncIO是单线程的,当数据可用时,它使用协程来交替处理网络数据。

高层级API和低层级API #

asyncio提供一组高层级API用于:

  • 并发地运行Python协程(Coroutines)并对其执行过程实现完全控制
  • 执行网络IO和IPC
  • 控制子进程
  • 通过队列实现分布式任务
  • 同步并发代码

此外,还有一些低层级API以支持库和框架的开发者实现:

  • 创建和管理事件循环,它提供用于连接网络, 运行子进程, 处理OS信号等功能的异步API
  • 使用transports实现高效率协议
  • 通过async/await语法桥接基于回调的库和代码

高层级API #

https://docs.python.org/3.13/library/asyncio-api-index.html

  • 运行器(Runners)
  • 协程与任务(Coroutines and Tasks)
  • 流(Streams)
  • 同步原语(Synchronization Primitives)
  • 子进程集(Subprocesses)
  • 队列集(Queues)
  • 异常(Exceptions)

低层级API #

https://docs.python.org/3.13/library/asyncio-llapi-index.html

  • 事件循环(Event Loop)
  • Futures(Futures)
  • 传输和协议(Transports and Protocols)
  • 策略(Policies)
  • 平台支持(Platform Support)
  • 扩展(Extending)

指南 #

© 2025 青蛙小白 | 总访问量 | 总访客数