协程的概念

Python程序在执行IO操作(或者sleep操作)时,必须等待完成才能接着执行下面的程序。显然这样不够高效。于是Python引入了协程,使程序在IO操作时,先运行其它程序,当IO操作完成以后再接着运行下面的程序。

协程是运行的单线程,只是子任务的切换。减少了进程切换的开销,大大提高了执行效率。

协程函数的语法

Python在3.5版本中引入了关于协程的语法糖async和await。

声明协程

将普通函数前面加关键词async,就成了异步函数(协程函数)。

1
2
async func():
print('我是一个异步函数')

调用协程

直接调用异步函数不会返回结果,而是返回一个coroutine对象:

1
2
print(func())
# <coroutine object fun at 0x10345bdc0>

我们用asyncio来调用协程

1
2
3
import asyncio
asyncio.run(func())
# 我是一个异步函数

在协程函数中,可以通过wait来挂起异步操作:

1
2
3
async func():
print('我是一个异步函数')
await asyncio.sleep(2)

要注意的是,await只能出现在async修饰的函数中。

如果有多个协程,可以通过 asyncio.wait 批量调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
async def fun1():
# 挂起异步操作
await asyncio.sleep(2)
print('我是函数:1')

async def fun2():
await asyncio.sleep(3)
print('我是函数:2')

async def func():
tasks = [
asyncio.create_task(fun1()), # 将协程对象包装成task对象
asyncio.create_task(fun1(fun2()))
]
# 挂起协程函数fun1,fun2
await asyncio.wait(tasks)

# 执行协程
async.run(func())