AsyncIO(Asynchronous IO)
AsyncIO是Python从3.4开始支持的一种并发编程实现。随着AsyncIO一起还有2个新增的关键字:
1. async
2. await
其中async关键词可以用来定义函数。比如:
async def foo():
pass
这样就可以定义一个异步的Python函数了。而await则可以用来等待异步的返回结果:
def bar():
await foo()
并发 vs 并行
在详细的了解AsyncIO之前,我们先来复习几个概念:
并行 (Parallelism)
并行是指同一时间有多个操作在同时执行。在Python中,我们通常使用Multiprocessing库来将任务分发到不同的CPU(or core)上运行。
并发(Concurrency)
相比于并行,并发在微观上不是同时执行的,它是把时间分成若干段(CPU时间片),使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行。因此,并发运行并发不一定并行。
一些基本概念
一个例子
我们以一个例子开始来了解AsyncIO是如何工作的:
# coding=utf-8
import asyncio
async def count():
print("Foo")
await asyncio.sleep(1)
print("Bar")
async def main():
await asyncio.gather(count(), count(), count())
if __name__ == "__main__":
import time
s = time.perf_counter()
asyncio.run(main())
elapsed = time.perf_counter() - s
print(f"{__file__} executed in {elapsed: 0.2f} seconds.")
执行这段打开,可以得到这样的输出:
Foo
Foo
Foo
Bar
Bar
Bar
test_asyncio.py executed in 1.00 seconds.
上面就是一个典型的AsyncIO程序的输出场景。