Python的AsyncIO


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程序的输出场景。

AsyncIO的基本原则