asyncio之异步并发的概念

异步并发的概念

  • 大多数使用其他并发模型的程序都是线性编写的,并且依赖于语言运行时或操作系统的底层线程或进程管理来适当的切换上下文。基于asyncio的程序要求程序代码明确的处理上下文的切换,正确的使用该技术处理任务需要理解几个相互关联的概念。
  • asyncio提供的框架以事件循环为中心,一个负责有效地处理输入/输出事件、系统事件和应用程序上下文切换的类对象。提供了不同的事件循环实现,以充分利用操作系统功能。通常会自动的选择合理的事件循环实现,也可以在程序中选择特定的事件循环实现。这在Windows操作系统中很有用,例如,某些事件循环类增加了对外部进程的支持,从而在网络I/O中提高一些效率。
  • 应用程序和事件循环的交互需要显示的注册要运行的代码,并在资源可用时让事件循环对应用程序代码进行必要的调用。例如,一个网络服务开放了sockets并注册了输入事件,当有一个新的连接产生或者发生数据读取时事件循环就会通知服务器进行处理。应用程序代码在很短的一段时间之后,在当前上下文中没有更多的工作可以完成之后,将再次获得控制权。例如,如果没有更多的数据可以从sockets中读取,服务器应该将控制权交还给事件循环。
  • 将控制权交给事件循环的机制依赖于Python的协程,一个特殊的函数,可以在不丢失上下文的情况下交出控制权给调用者。协程和生成器函数很类似,事实上,在Python 3.5之前的版本生成器被用来实现协程,而不是原生的支持协程对象。asyncio也为protocols和transports层提供了基于类的抽象,用于使用回调来编写代码而不是直接使用协程来编写。asyncio通过重新进入事件循环显示的切换上下文取代了Python线程实现的隐式切换上下文。
  • 一个Future表示一个将会在未来完成的工作结果的对象,封装一个可调用的异步执行。事件循环可以监视Future对象的完成,允许程序的一部分等待其他的一部分完成工作。除了future,asyncio还包含了其他的并发原语如locks和semaphores。
  • Task是Future的子类,它知道如何包装和管理协程的执行。当Task需要的资源可用时可以被事件循环调度运行,并产生一个可以被其他协程消费的结果。

本文翻译自《The Python3 Standard Library By Example》asyncio相关章节

文章目录
|