大概半年前开始使用asyncio。最初开始接触asyncio是受到“车主”的影响,因为他说他的项目基本都是使用的aio的方式,例如aioredis,aiokafka,aiomysql等。
但是之前对asyncio的用法一直有误解,就连之前写的异步消费埋点数据的项目看似用了async的语法,但实际上并没有真正的实现异步。下面通过最基本简单的例子来纠正之前理解上的错误:
import asyncio
async def main():
print('Hello ...')
await asyncio.sleep(5)
print('... World!')
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
错误的理解:
既然是异步的运行,那这里其实有两个协程,一个是main(),一个是asyncio.sleep(5)。当asyncio.sleep(5)在执行的时候控制权应该交回给main(),所以print(’… World!’)应该在sleep之前打印出来。
但实际上在执行的时候发现print(’… World!’)并没有立刻被打印,而是在等待了5s之后才被打印出来。这里看上去有多个协程,而且asyncio.run的使用方法也没错,为什么并没有实现真正的异步呢?
正确的理解:
参考了stack overflow上的解释&#x