一、背景
asyncio是python3.4后推出的新的并发模块,主要是用coroutines和futures来简单的实现异步的功能,并且使用 的是同步的代码实现异步的功能,还没有回调的方法。
在后来3.7版本后升级了api的方法,主要是对task以及event loops的方法的升级。
现在来说,由于异步需要配合相对应的异步库来进行调用,可能生态会有不完善的地方。
二、几个重要的对象
- event loops:主要是实现了一个循环监听的机制,我们可以将task注册到上边。
- coroutines: 协成对象,是与python生成器类似的函数,需要用关键字async进行声明,同时在函内有关键字await,当coroutines执行到await的时候,会将控制权交给event loop。
- futures:代表将来执行或者没有执行的任务的结果,这个结果也可能是异常。
三、同步和异步
在协成中,asyncio让我们把任务定义为coroutiness,允许我们自己进行调度
举例1:
import asyncio
async def foo():
print("running in foo")
await asyncio.sleep(0)
print("back foo")
async def bar():
print("running in bar")
await asyncio.sleep(0)
print("back bar")
async def main():
tasks = [foo(), bar()]
await asyncio.gather(*tasks) # 这里是创建task,是一个未执行的futures对象。
asyncio.run(main())
执行结果:
running in foo
running in bar
back foo
back bar
执行说明:
1、await是用来将控制权交出,让其他协成执行的关键字
2、sleep这里使用的是asyncio.sleep是因为在协程对象中这是模拟阻塞用的睡眠(time.sleep是阻塞整个线程)。用sleep(0)是为了让其他协成进行运行。
3、最后的run方法是py37+版本中,我们不用进行创建事件循环命令,run都创建好了
网友评论