深入理解协程(三):async/await实现异步协程

本文深入解析Python3.5引入的async/await语法,用于简化异步协程的实现。讲解了如何创建协程、任务对象task的创建与管理,以及如何绑定回调函数和处理多任务协程。通过实例展示了如何从yield from风格转换为async/await风格,使代码更简洁易懂。
摘要由CSDN通过智能技术生成

原创不易,转载请联系作者

深入理解协程分为三部分进行讲解:

  • 协程的引入
  • yield from实现异步协程
  • async/await实现异步协程

本篇为深入理解协程系列文章的最后一篇

从本篇你将了解到:

  1. async/await的使用。
  2. 如何从yield from风格的协程修改为async/await风格。

篇幅较长,请耐心阅读。

async/await的引入

上篇【yield from实现异步协程】我们引入了asynico模块,结合yield from实现异步协程。但语法不够简洁,其中涉及的生成器装饰器也让人头疼不已。

为了语法更加简洁。于是,在Python3.5(PEP 492)中新增了async/await语法来实现异步协程。

async/await的使用

先介绍几个概念:

  • async/await :python3.5之后用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。
  • event_loop :事件循环,程序开启一个无限的循环,程序员会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。
  • coroutine :协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。
  • task :任务,是对协程进一步封装,其中包含任务的各种状态。
  • future: 代表将来执行或没有执行的任务的结果。它和task上没有本质的区别

1.创建协程

在def前加上async的声明,就完成了一个协程函数的定义。协程函数不能直接调用运行,需要将协程注册到事件循环,并启动事件循环才能使用

import asyncio

async def fun(a):    # 定义协程函数
    print(a)

# 调用协程函数,生成一个协程对象,此时协程函数并未执行
coroutine = fun('hello world')
# 创建事件循环
loop = asyncio.get_event_loop()
# 将协程函数添加到事件循环,并启动
loop.run_until_complete(coroutine)

# 输出
hello word

2. 任务对象task

协程对象不能直接运行,在注册事件循环的时候,其实是run_until_complete方法将协程包装成为了一个任务(task)对象。我们也可以显式实现它。

实现方式1:

使用create_task()创建task。

import asyncio

async def fun(a):
    print(a)
    return a

coroutine = fun('hello world')
loop = asyncio.get_event_loop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值