asyncio — Asynchronous I/O #
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 #
- 运行器(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)