模块 asyncio 是一个异步IO和并发框架。
asyncio 提供了协程 coroutines 创建并发应用,它使用单线程,单进程的模式进行显示的任务切换。大部分的任务切换都发生在可能会阻塞的地方,例如读取文件或者网络等等。asyncio 提供了一些特性包括在指定时间运行某个任务,指示某个 coroutines 等待其他的完成才开始执行等等。
模块 threading 和 multiprocessing 分别使用多线程和多进程进行多任务的同步运行。
概念
大多数应用程序都是线性的开发,然后依赖语言底层的线程或者进程切换任务并行运行。基于 asyncio 开发的并发程序需要在程序中手动进行上下文的切换,因为它运行在单线程,单进程的模式上。下面是需要理解的一些概念。
asyncio 框架里需要重点专注的是事件循环(event loop),它是处理事件(event)的一个主要对象,例如IO事件、系统事件、应用任务切换等等。
应用首先需要注册(register)要运行的任务到事件循环中,当得到所需的资源后,已注册的任务被事件循环唤醒执行。例如服务端程序当收到一个客户端的请求或者有数据要读取时再执行操作,当处理完成后,立刻把控制权交回给事件循环准备接受下一个事件。
控制器交回给事件循环依赖协程 coroutines,它是一个特殊的函数把控制器交回而不丢失状态,这和 yield 非常类似。事实上,在 Python 3.5 之前要想实现协程,就要使用 yield 生成器函数。asyncio 提供了基于类的抽象层,可以直接写回调方法而不用写协程。
对象 Future 是一个表示结果的数据结构,asyncio 可以监控一个 Future 对象允许应用等待一项任务完成时返回。
Future 的子类 Task 知道怎么管理一个协程的执行,Task 可以等待一个资源可用时,由事件循环调用。
协程 Coroutine
协程 Coroutine 是运行并