原文转自:https://drizzle.vip/archives/275
我第一次接触 异步编程 肯定是在JavaScript,第一次写延时函数的时候很奇怪为啥延时函数下面的代码会直接执行而不等待时间结束,然后就对异步编程有了一点点的了解,后面在看一个Python的qq机器人项目的时候发现里面使用了大量的异步函数,可惜没有去认真学,今天就来重新 补补 python 的异步实现~
什么是 异步 ? 什么是 同步?
举一个简单的例子,假设有一个爬虫程序,需要爬取一百张图片,同步的方法就是从第一张开始爬取,先发送请求,然后下载,保存,然后循环继续请求第二张,下载保存······ 异步的方式呢,就是遇到需要消耗大量时间的IO时会先去执行其他的函数,我们的下载保存就是整个爬虫程序中最需要时间的部分,可以通过异步编程,在发送第一个图片下载请求后等待下载图片的时间不闲着继续发送第二个请求,然后一直发送,发送请求的速度可以忽略,相当于100张图片在同时下载,不考虑自身网络情况,假设一张图片的下载需要1s,那同步的实现方式需要100s才能爬取全部图片,而异步只需要1s多一点,效率翻 N 倍!
怎样实现异步编程
从 Python 3.5 开始引入了 async 和 await 关键词:
import asyncio
async def a():
print('a')
await asyncio.sleep(2)
print('a')
async def b():
print('b')
print('b')
asyncio.run(asyncio.wait([a(), b()]))
如上述代码块,在函数前声明async就表示当前函数为协程函数,函数内可以使用await 用于等待高 IO 代码的执行,其中的a函数在 输出第一行a之后会休眠2s,这时候不会去一直等他,而是会先去执行b函数,所以最终的输出结果为:
a
b
b
a
最后一行 asyncio.run(asyncio.wait([a(), b()])) 中的 asyncio.run() 这个API是Python 3.7 引入的,用来简便的去执行异步函数~
|