asyncio里面主要有4个需要关注的基本概念
Eventloop
Eventloop可以说是asyncio应用的核心,是中央总控。Eventloop实例提供了注册、取消和执行任务和回调的方法。
把一些异步函数(就是任务,Task,一会就会说到)注册到这个事件循环上,事件循环会循环执行这些函数(但同时只能执行一个),当执行到某个函数时,如果它正在等待I/O返回,事件循环会暂停它的执行去执行其他的函数;当某个函数完成I/O后会恢复,下次循环到它的时候继续执行。因此,这些异步函数可以协同(Cooperative)运行:这就是事件循环的目标。
Coroutine
协程(Coroutine)本质上是一个函数,特点是在代码块中可以将执行权交给其他协程:
import asyncio
async def a():
print('Suspending a')
await asyncio.sleep(0)
print('Resuming a')
async def b():
print('In b')
async def main():
await asyncio.gather(a(), b())
if __name__ == '__main__':
asyncio.run(main())
这里面有4个重要关键点:
- 协程要用
async def
声明,Python 3.5时的装饰器写法已经过时,我就不列出来了。 - asyncio.gather用来并发运行任务,在这里表示协同的执行a和b2个协程
- 在协程a中,有一句
await asyncio.sleep(0)
,await表示调用协程,sleep 0并不会真的sleep(因为时间为0),但是却可以把控制权交出去了。 - asyncio.run是Python 3.7新加的接口,要不然你得这么写:
-
loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()