今天开始聊一聊python3的asyncio。关于asyncio,大家肯定都有自己的理解,并且网上大神也把基础概念也解释的比较透彻。
本文写作的初衷,主要是理解asyncio的原理并且实现一遍。
话不多说,我们开始!
一、知识准备
● 理解进程、线程、协程。简单来说,这三个都是为了解决多任务同时进行的问题
1)进程是操作资源分配的最小单位,多任务的实现主要是极快地在进程间来回切换,而进程切换消耗时间最长(系统调用)
2)线程依赖于进程,多个线程共享了父进程的一部分资源,线程切换时间相对于进程来说消耗时间大大减少,但是由于python gil的存在,并不存在多线程(系统调用)
3)协程依赖于线程,由于进程/线程切换都是系统调用,开销是巨大的。而协程是在用户空间内完成任务切换,不会切换到操作系统资源(寄存器、信号量、堆栈等),所以这种方式开销最小。python的协程核心在于,遇到等待事件,就交出cpu控制权,转而让其他协程执行
● 理解python生成器,yield/yield from
这里就不班门弄斧了,直接推荐大佬的blog
● 理解关键字async/await,async/await是3.5之后的语法,和yield/yield from异曲同工 。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以架尉♥信(同音):276 3177 065 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~
|二、环境准备
组件
|
版本
|
|
python
|
3.7.7
|
三、run_until_complete的实现
先来看下官方asyncio的使用方法:
|># more main.pyimport asyncioasync def hello():
print('enter hello ...')
return 'world'if __name__ == "__main__":
loop = asyncio.get_event_loop()
task = loop.create_task(hello())
rst = loop.run_until_complete(task)
print(rst) |>
# python3 main.pyenter hello ...world
来看下造的轮子的使用方式:
▶ more main.pyfrom wilsonasyncio import get_event_loopasync def hello():
print('enter hello ...')
return 'world'if __name__ == "__main__":
loop = get_event_loop()
task = loop.create_task(hello())
rst = loop.run_until_complete