Python asyncio模块
asyncio模块
事件循环
大多数异步应用程序实现异步的基本机制是通过在后台执行的事件循环。当有代码需要执行时,这些代码才会被注册到事件循环中。大多数程序都是依赖这个机制实现的,比如服务器,桌面程序,大多数视频游戏等。
一般情况下,我们不需要自己创建一个事件循环对象,只需要调用asyncio.get_event_loop()函数,返回一个BaseEventLoop对象即可。这个类帮你隐藏了细节,你不需要关心不同平台的区别。在所有平台上的API都是相同的,但是在某些平台上会有功能限制。
要注意的是,当你第一次获得循环对象时,它还没有开始执行。
1 | |
1.执行循环
2.注册任务并执行循环
3.延迟调用
4.偏函数
5.任务结束前执行循环
6.执行一个后台循环
协程
在asyncio中使用的大多数函数都是协程(coroutines)。协程是一种被设计用于在事件循环中执行的特殊函数。此外, 如果创建了协程但并未执行它,那么将会在日志中记录一个错误。3.6以下的版本可以使用@asyncio.coroutine装饰器,3.6以上可以使用async def xx 这样的新语法。一个简单的示例:
1 | |
这样coro_sum函数就是一个协程,由事件循环来调用。此时已经不能再用常规方式调用这个函数了。
协程实际上是一个由事件循环消费的特殊生成器
嵌套的协程
协程提供了一种模仿顺序编程来调用其他协程的特殊机制,通过使用await关键字,一个协程可以执行另外一个协程,并由语句返回结果
Future对象与Task对象
由于使用asyncio完成的大部分工作都是异步的,因此在处理以异步方式执行函数的返回值时必须小心。为此await关键字提供了一种处理方式。但是当希望并行执行异步函数的时候,就会需要一些别的处理方式。
Future对象
Future是一个用于获取异步函数状态的对象,这包括函数的状态,比如函数是执行中,已完成,或者是已取消,还包括函数的返回值,或者是当函数引发异常时,返回对应的异常和回溯。
Future是一个独立的对象,并不依赖正在执行的函数。该对象仅仅用于存储状态和结果信息,除此之外,并没有别的卵用。
Task对象
Task对象是Future对象的子类,也是使用asyncio编程时最常用的对象,每当一个协程在事件循环中被安排执行后,协程就会被一个Task对象包装起来。因此,当你调用run_until_complete并传递一个协程时,该协程会被包装到一个Task对象中并执行,Task对象的任务是存储结果并为await语句提供值。
run_until_complete方法并不是将一个协程包装到类中的唯一方式。完成这类工作的主要方式是使用ensure_future方法。
未完待续….