Python学习笔记(4)——Asyncio
这次超纲了,部分内容我们没有学过,所以看看就行了。
hahaha,我这次破一次例,开始教大家学异步(携程)。
由于异步IO要求很高的水平,所以我们后面讲。要看同步IO(人机交互),请移步:Python学习笔记(3)——人机交互
1.概念:多线程、多进程、携程
事实上,在异步操作的过程中,多线程与多进程才是王道。
有了它们,甚至可以一秒干完10件事。
要是一个线程堵塞,没事,咱可以换。
所以这样看,多线程与多进程确实很棒。
但是,它们很麻烦。
一个print就要10行,震惊了吧?
而且还涉及Lock,想一想你会吗?
而Python 3.4终于迎来了异步的又一选择。作为新引入的模块,Asyncio这种异步携程编写简单,易上手,迎来了更多人的欢迎。
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
但在运行时,他却这样运行:
速度倒是变快了。
怎么回事呢?
其实,它先打印出1,再因为await转让执行权,打印出a,再因为await转让执行权,打印出2,再因为await转让执行权,打印出b。
就是这么简单。
当然了,同学们后面也可以研究多线程与多进程,但是Asyncio已经很强大了。
好啦,这就是本期的内容!
散会~








