协程
2021-03-29发布
|

协程的概念

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

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

协程函数的语法

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

声明协程

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

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

调用协程

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

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

我们用asyncio来调用协程

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

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

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

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

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

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())
------------ END ------------