首页 » 运维 » 正文

asyncio python 协程

python 中的协程其实就是一种高效的任务切换模式: 遇到需要等待的(例如io等待), 直接跳到其他任务去执行,不会傻傻的等到io结束才向下执行

先看一个如果没有异步的例子:

运行结果:

也就是说,我们如果没有异步,那么我们的程序运行时间至少是4秒,因为它傻傻的等到第一个2s结束以后又执行的第二个

但是,其实,当第一个程序在等待的时候,它完全可以干其他的,例如,跳到第二个程序func2开始执行,然后等到func1通知我们说sleep 够了,抓紧回来继续执行的时候再跳回来

看看异步的例子:

看看运行结果:

从时间来看很明显,同样是执行两个函数,但是异步的一共才花了了不到3s,最起码时间上有节省

我们详细说一下我们的异步程序:

其中最重要的是定义函数的时候我们前边加了 async 关键词, 让这个函数变成一个特殊的函数

然后函数中使用了await,   await 的意思可以理解为,当程序运行到这个地方的时候,可能会有等待,无论是IO等待还是其他的,如果有其他的工作,可以先去忙其他的

那如何知道有没有其他工作呢?

其实就是这个loop = asyncio.get_event_loop()

 

这个就是创建了一个任务池子,池子里放任务,池子里的任务是可以相互切换的,例如我们的例子中,loop里放了俩task, 一个是func1 ,一个是func2

也就是,他俩其中任何一个遇到等待(await),就去查一下池子里有没有其他的任务,如果有,就去执行其他的,过会不再等待了,再回来执行

也就是我们的输出结果中并不是顺序执行结果的原因

 

 

 

 

 

Zhiming Zhang

Senior devops at Appannie
一个奔跑在运维路上的胖子
Zhiming Zhang

Latest posts by Zhiming Zhang (see all)