第十章:使用进程、线程和协程提供并发性-asyncio:异步I/O、事件循环和并发工具-异步并发概念

10.5 asyncio:异步I/O、事件循环和并发工具
asyncio模块提供了使用协程构建并发应用的工具。threading模块通过应用线程实现并发,multiprocessing使用系统进程实现并发,asyncio则使用一种单线程单进程方法来实现并发,应用的各个部分会彼此合作,在最优的时刻显式地切换任务。大多数情况下,会在程序阻塞等待读写数据时发生这种上下文切换,不过asyncio也支持调度代码在将来的某个特定时间运行,从而支持一个协程等待另一个协程完成,以处理系统信号和识别其他一些事件(这些事件可能导致应用改变其工作内容)。

10.5.1 异步并发概念
使用其他并发模型的大多数程序都采用线性方式编写,而且依赖与语言运行时系统或操作系统的底层线程或进程管理来适当地改变上下文。基于asyncio的应用要求应用代码显式地处理上下文切换,要正确地使用相关技术,这取决于是否能正确理解一些相关联的概念。asyncio提供的框架以一个事件循环(event loop)为中心,这是一个首类对象,负责高效地处理I/O事件、系统事件和应用上下文切换。目前已经提供了多个循环实现来高效地利用操作系统的功能。尽管通常会自动地选择一个合理的默认实现,但也完全可以在应用中选择某个特定的事件循环实现。在很多情况下这会很有用,例如,在Windows下,一些循环类增加了对外部进程的支持,这可能会以牺牲一些网络I/O效率为代价。与事件循环交互的应用要显式地注册将运行的代码,让事件循环在资源可用时向应用代码发出必要的调用。例如,一个网络服务器打开套接字,然后注册为当这些套接字上出现输入事件时服务器要得到通知。事件循环在建立一个新的进入连接或者在数据可读取时都会提醒服务器代码。当前上下文中没有更多工作可做时,应用代码要再次短时间地交出控制。例如,如果一个套接字再没有更多的数据可以读取,那么服务器会把控制交回给事件循环。
将控制交还给事件循环的机制依赖于Python的协程(coroutine)这是一些特殊的函数,可以将控制交回给调用者而不丢失其状态。协程与生成器函数非常类似。asyncio还为协议(protocol)和传输(transport)提供了一个基于类的抽象层,可以使用回调编写代码而不是直接编写协程。在基于类的模型和协程模型中,可以通过重新进入事件循环显式地改变上下文,以取代Python多线程实现中隐式地上下文改变。future是一个数据结构,表示还未完成的工作结果。事件循环可以监视Future对象是否完成,从而允许应用的一部分等待另一部分完成一些工作。除了future,asyncio还包括其他并发原语,如锁和信号量。
Task是Future的一个子类,它知道如何包装和管理一个协程的执行。任务所需的资源可用时,事件循环会调度任务运行,并生成一个结果,从而可以由其他协程消费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值