moduleasyncio是一个异步IO和并发框架。asyncio提供协程来创建并发应用程序,这些应用程序使用单线程、单进程模式进行显式任务切换。大部分任务切换发生在可能阻塞的地方,比如读取文件或者网络等。Asyncio提供了一些特性,包括在指定的时间运行某个任务,指示某些协程等待其他协程完成后再开始执行等等。threading和multiprocessing模块分别使用multi-threading和multi-processing进行多任务同步操作。概念大多数应用程序都是线性开发的,然后依赖底层语言的线程或进程切换任务并行运行。基于asyncio开发的并发程序,由于是单线程单进程运行,所以需要在程序中手动进行上下文切换。这里有一些概念需要理解。asyncio框架中需要重点关注的是事件循环,它是处理事件的一个主要对象,比如IO事件、系统事件、应用程序任务切换等。应用程序首先需要将要运行的任务注册(register)到事件循环中,当获取到需要的资源时,注册的任务被事件循环唤醒执行。例如,服务器程序在收到来自客户端的请求或有数据要读取时执行操作。当处理完成后,它立即将控制权返回给事件循环,为下一个事件做准备。将控制器交还给事件循环依赖于协程,协程是在不丢失状态的情况下交还控制器的特殊功能,这与yield非常相似。事实上,在Python3.5之前实现协程需要使用yield生成器函数。asyncio提供了一个基于类的抽象层,可以让你直接写回调方法,不用写协程。对象Future是表示结果的数据结构。Asyncio可以监视Future对象以允许应用程序等待任务完成并返回。Future的子类Task知道如何管理协程的执行。当资源可用时,事件循环可以调用任务。Coroutine协程是一种用于运行并发操作的语言结构。当调用协程函数时,会创建一个携程对象,然后通过调用该对象的send()方法来执行其定义的代码。协程也可以使用await关键字在不丢失状态的情况下暂停执行,然后等待唤醒继续执行。运行协程要让事件循环运行协程,最简单的方法是调用run_until_complete(),将协程对象作为参数传递。执行:本例中async关键字放在函数coroutine()之前,表示这是一个协程函数。run_until_complete()方法传入协程对象,启动事件循环,协程对象退出后返回。***使用try:finally来确保***事件循环已关闭。从协程返回值run_until_complete()可以返回协程的结果。执行:协程链接一个协程可以启动另一个协程并等待它的结果,这使得将一个任务分解成多个可重用的部分变得更加容易。以下示例显示了两个必须按顺序执行但可以与其他协程并发运行的协程。执行:本例中,在协程worker()中,创建了两个协程,使用了关键字await。因为控制流已经在事件循环中,所以这里创建的两个协程也是由事件循环管理的。协程调用普通函数asyncio也可以在事件循环中调用普通函数。如果对调用时间没有要求,call_soon()方法会在事件循环中下次调用该函数。call_soon()方法的第一个参数是函数引用,第二个参数是传递给函数的参数。如果需要传递多个参数,比如关键字参数,可以使用functools模块的partial()函数。Execution:Delaycallingthefunction使用方法call_later()来延迟调用回调函数,第一个参数是要延迟的时间,单位是秒。执行:在这个例子中,同一个回调函数被不同参数多次调用,call_soon()方法会使用最小的延迟时间,所以先执行。在指定时间调用函数有时需要在指定时间执行回调函数。事件循环使用的时钟是单调时钟,而不是挂钟。所以为了保证时间不会倒退,应该使用事件循环的时间,因为walltime是可以修改的。单调时钟表示在某个时间点自然流逝的时间,不受时间时钟修改的影响。例如,如果你不想因为电脑重启而影响时间,你应该使用它。walltime一般就是我们在电脑上看到的时间,可以手动修改,包括NTP修改。(NTP:NetworkTimeProtocol是一种用来同步网络时间和本地时间的协议,它可以让服务器或时钟源同步修改后的时间)执行:
