Python学习笔记(4)——Asyncio

这次超纲了,部分内容我们没有学过,所以看看就行了。

hahaha,我这次破一次例,开始教大家学异步(携程)。

由于异步IO要求很高的水平,所以我们后面讲。要看同步IO(人机交互),请移步:Python学习笔记(3)——人机交互


1.概念:多线程、多进程、携程

事实上,在异步操作的过程中,多线程与多进程才是王道。

有了它们,甚至可以一秒干完10件事。

多线程与多进程

要是一个线程堵塞,没事,咱可以换。

所以这样看,多线程与多进程确实很棒。

更换线程

但是,它们很麻烦。

一个print就要10行,震惊了吧?

而且还涉及Lock,想一想你会吗?

不会写代码……

而Python 3.4终于迎来了异步的又一选择。作为新引入的模块,Asyncio这种异步携程编写简单,易上手,迎来了更多人的欢迎。

Asyncio yyds


2.Asyncio是怎么设计的

Asyncio其实是单线程。

那有的小伙伴肯定会说:

那还叫异步吗?这是异步呀,异步!!单线程怎么行!!

但Asyncio的设计方式是“协作多任务”(Cooperative multitasking),即携程。也就是说,A在处理完一些任务后,放出执行权,B干其他的任务,弄完后,再放出执行权,以此类推,再回到A的手上。

放出执行权

因此,Asyncio少了多线程与多进程的各种麻烦操作,简单易上手。


3.那还等什么?!开始呀!?

“好好好好,开始开始开始......”(熬夜继续编)

注意!该写法只适用于Python 3.7以上!

首先是导入,不然简直是没法用。

import asyncio

紧接着,设定两个任务,这里需要用到函数(也就是超纲的地方……)。不一样的是要标注async。(注意要放到main里,不能放到任何嵌套函数下)

async def one():
    # 你的代码......
async def two():
    # 你的代码......

接下来,设定放出执行权的地方。也就是用await语句。

比如,one里面:

print(1)
await asyncio.sleep(0) # 0的意思是不等待,直接放出执行权。
print(2)

two里面:

print('a')
await asyncio.sleep(0)
print('b')

然后,再输入:(注意要放到main里,不能放到任何嵌套函数下)

async def system():
    await asyncio.gather(one(),two())
asyncio.run(system())

完成后,就应该是这样子:

import asyncio
async def one():
    print(1)
    await asyncio.sleep(0) # 0的意思是不等待,直接放出执行权。
    print(2)
async def two():
    print('a')
    await asyncio.sleep(0)
    print('b')
async def system():
    await asyncio.gather(one(),two())
asyncio.run(system())

代码的样子

我们想他应该这样运行:

1
2
a
b

但在运行时,他却这样运行:

img

速度倒是变快了。

怎么回事呢?

其实,它先打印出1,再因为await转让执行权,打印出a,再因为await转让执行权,打印出2,再因为await转让执行权,打印出b。

就是这么简单。

当然了,同学们后面也可以研究多线程与多进程,但是Asyncio已经很强大了。

Asyncio已经很强大了


好啦,这就是本期的内容!

散会~

img

results matching ""

    No results matching ""