Python 异步之推导式示例详解

作者:冷冻工厂 时间:2021-05-16 17:31:08 

引言

当我们想到“pythonic”时,理解,如列表和字典理解是 Python 的一个特性。

这是我们执行循环的一种方式,与许多其他语言不同。

Asyncio 允许我们使用异步推导式。

我们可以通过“async for”表达式使用异步推导式来遍历异步生成器和异步迭代器。

1. 什么是异步推导式

异步推导式是经典推导式的异步版本。Asyncio 支持两种类型的异步推导式,它们是“async for”推导式和“await”推导式。

在我们看每之前,让我们首先回顾一下经典的推导式。

2. 推导式

推导式允许以简洁的方式创建列表、字典和集合等数据集合。列表推导式允许从新列表表达式中的 for 表达式创建列表。

...
# create a list using a list comprehension
result = [a*2 for a in range(100)]

还支持推导式来创建字典和集合。

...
# create a dict using a comprehension
result = {a:i for a,i in zip(['a','b','c'],range(3))}
# create a set using a comprehension
result = {a for a in [1, 2, 3, 2, 3, 1, 5, 4]}

3. 异步推导式

异步推导式允许使用带有异步可迭代对象的“async for”表达式来创建列表、集合或字典。

...
# async list comprehension with an async iterator
result = [a async for a in aiterable]

这将根据需要创建和安排协程或任务,并将其结果放入列表中。

回想一下,“async for”表达式只能在协程和任务中使用。

另外,回想一下异步迭代器是一个产生可等待对象的迭代器。

“async for”表达式允许调用者遍历等待对象的异步迭代器并从每个对象中检索结果。

在内部,async for 循环将根据需要自动解析或等待每个可等待的调度协程。

异步生成器自动实现异步迭代器的方法,也可用于异步推导式。

...
# async list comprehension with an async generator
result = [a async for a in agenerator]

4. Await 推导式

“等待”表达式也可以在列表、集合或字典理解中使用,称为等待推导式。

与异步推导式一样,它只能在异步协程或任务中使用。

这允许通过挂起和等待一系列可等待对象来创建数据结构,如列表。

...
# await list compression with a collection of awaitables
results = [await a for a in awaitables]

这将通过依次等待每个可等待对象来创建结果列表。

当前协程将被挂起以顺序执行可等待对象,这与使用 asyncio.gather() 并发执行它们不同,而且可能更慢。

来源:https://juejin.cn/post/7210744398649655333

标签:Python,异步,推导式
0
投稿

猜你喜欢

  • Python Socket编程入门教程

    2022-03-08 01:08:49
  • Ethnique公司logo设计过程和思路

    2009-09-19 17:04:00
  • Go语言实现超时的三种方法实例

    2023-06-22 18:32:43
  • python安装dlib库报错问题及解决方法

    2023-01-27 16:24:41
  • Python学习笔记之列表推导式实例分析

    2021-04-30 15:00:38
  • 对python中的乘法dot和对应分量相乘multiply详解

    2021-01-14 15:54:58
  • OpenCV半小时掌握基本操作之分水岭算法

    2023-04-10 11:24:51
  • SQL语句中EXISTS的详细用法大全

    2024-01-22 11:09:11
  • python判断一个集合是否包含了另外一个集合中所有项的方法

    2022-01-15 19:08:06
  • MySQL 开启慢查询日志的方法

    2024-01-20 13:41:05
  • Python多线程编程(三):threading.Thread类的重要函数和方法

    2021-04-22 09:02:47
  • 跟老齐学Python之编写类之四再论继承

    2022-01-08 10:18:12
  • python非单一.py文件用Pyinstaller打包发布成exe

    2021-12-19 00:40:05
  • 详解vue-router 2.0 常用基础知识点之router.push()

    2024-04-09 10:49:35
  • 详解从Django Allauth中进行登录改造小结

    2021-05-05 14:26:58
  • 模糊查询的通用存储过程

    2024-01-23 06:49:12
  • 浅谈ES6 模板字符串的具体使用方法

    2024-04-18 10:02:01
  • MySQL数据库INNODB表损坏修复处理过程分享

    2024-01-16 10:59:56
  • django表单中的按钮获取数据的实例分析

    2021-05-17 04:38:04
  • eWebEditor不支持IE8的解决方法

    2009-11-02 10:59:00
  • asp之家 网络编程 m.aspxhome.com