Python 异步等待任务集合

目录
  • 正文
  • 1. 什么是 asyncio.wait()
  • 2. 如何使用 asyncio.wait()
  • 3. 等待所有任务的示例

正文

我们可以通过 asyncio.wait() 函数等待异步任务完成。可以等待不同的条件,例如所有任务完成、第一个任务完成以及第一个任务因异常而失败。

让我们仔细看看。

1. 什么是 asyncio.wait()

asyncio.wait() 函数可用于等待一组异步任务完成。回想一下,asyncio 任务是包装协程的 asyncio.Task 类的一个实例。它允许独立调度和执行协程,Task 实例提供任务句柄以查询状态和获取结果。

wait() 函数允许我们等待一组任务完成。等待调用可以配置为等待不同的条件,例如所有任务完成、第一个任务完成以及第一个任务因错误而失败。

接下来,让我们看看如何使用 wait() 函数。

2. 如何使用 asyncio.wait()

asyncio.wait() 函数采用可等待对象的集合,通常是 Task 对象。

这可以是我们创建的列表、字典或任务对象集,例如通过在列表理解中调用 asyncio.create_task() 函数。

...
# create many tasks
tasks = [asyncio.create_task(task_coro(i)) for i in range(10)]

asyncio.wait() 在满足任务集合的某些条件之前不会返回。默认情况下,条件是所有任务都已完成。

wait() 函数返回两个集合的元组。第一个集合包含所有满足条件的任务对象,第二个集合包含所有其他尚未满足条件的任务对象。

这些集被称为“完成”集和“待定”集。

...
# wait for all tasks to complete
done, pending = await asyncio.wait(tasks)

从技术上讲,asyncio.wait() 是一个返回协程的协程函数。然后我们可以等待这个协程,它将返回集合的元组。

...
# create the wait coroutine
wait_coro = asyncio.wait(tasks)
# await the wait coroutine
tuple = await wait_coro

等待的条件可以由默认设置为 asyncio.ALL_COMPLETED 的“return_when”参数指定。

...
# wait for all tasks to complete
done, pending = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED)

我们可以通过将 return_when 设置为 FIRST_COMPLETED 来等待第一个任务完成

...
# wait for the first task to be completed
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)

当第一个任务完成并在完成集中返回时,其余任务不会被取消并继续并发执行。

我们可以通过将 return_when 设置为 FIRST_EXCEPTION 来等待第一个任务因异常而失败。

...
# wait for the first task to fail
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION)

在这种情况下,完成集将包含第一个因异常而失败的任务。如果没有任务因异常而失败,则完成集将包含所有任务,只有在所有任务完成后 wait() 才会返回。

我们可以通过以秒为单位的“超时”参数指定我们愿意等待给定条件的时间。

如果在满足条件之前超时到期,则返回任务元组以及当时满足条件的任何任务子集,例如如果等待所有任务完成,则完成的任务子集。

...
# wait for all tasks to complete with a timeout
done, pending = await asyncio.wait(tasks, timeout=3)

如果在满足条件之前达到超时,则不会引发异常并且不会取消剩余任务。

现在我们知道如何使用 asyncio.wait() 函数,让我们看一些有效的例子。

3. 等待所有任务的示例

我们可以探索如何使用 asyncio.wait() 等待所有任务。在这个例子中,我们将定义一个简单的任务协程,它生成一个随机值,休眠几分之一秒,然后用生成的值报告一条消息。

然后,主协程将与协程一起在列表理解中创建许多任务,然后等待所有任务完成。

# SuperFastPython.com
# example of waiting for all tasks to complete
from random import random
import asyncio
# coroutine to execute in a new task
async def task_coro(arg):
    # generate a random value between 0 and 1
    value = random()
    # block for a moment
    await asyncio.sleep(value)
    # report the value
    print(f'>task {arg} done with {value}')
# main coroutine
async def main():
    # create many tasks
    tasks = [asyncio.create_task(task_coro(i)) for i in range(10)]
    # wait for all tasks to complete
    done,pending = await asyncio.wait(tasks)
    # report results
    print('All done')
# start the asyncio program
asyncio.run(main())

运行示例首先创建 main() 协程并将其用作 asyncio 程序的入口点。

然后 main() 协程在列表理解中创建一个包含十个任务的列表,每个任务提供一个从 0 到 9 的唯一整数参数。

然后 main() 协程被挂起并等待所有任务完成。任务执行。每个生成一个随机值,休眠片刻,然后报告其生成的值。

所有任务完成后,main() 协程恢复并报告最终消息。这个例子强调了我们如何使用 wait() 函数来等待一组任务完成。

这可能是该函数最常见的用法。请注意,由于使用了随机数,每次运行程序时结果都会不同。

>task 5 done with 0.0591009105682192
>task 8 done with 0.10453715687017351
>task 0 done with 0.15462838864295925
>task 6 done with 0.4103492027393125
>task 9 done with 0.45567100006991623
>task 2 done with 0.6984682905809402
>task 7 done with 0.7785363531316224
>task 3 done with 0.827386088873161
>task 4 done with 0.9481344994700972
>task 1 done with 0.9577302665040541
All done

以上就是Python 异步等待任务集合的详细内容,更多关于Python 异步等待任务集合的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python异步之迭代器如何使用详解

    目录 正文 1. 什么是异步迭代器 1.1. Iterators 1.2. Asynchronous Iterators 2. 什么是“async for”循环? 3. 如何使用异步迭代器 4. 异步迭代器示例 正文 迭代是 Python 中的基本操作.我们可以迭代列表.字符串和所有其他结构. Asyncio 允许我们开发异步迭代器.我们可以通过定义一个实现 aiter() 和 anext() 方法的对象来在 asyncio 程序中创建和使用异步迭代器. 1. 什么是异步迭代器 异步迭代器是一个

  • 如何使用Python异步之上下文管理器

    目录 正文 1. 什么是异步上下文管理器 1.1. Context Manager 1.2. Asynchronous Context Manager 2. 如何使用异步上下文管理器 2.1. 定义 2.2. 使用 3. 异步上下文管理器和“异步”示例 正文 上下文管理器是一种 Python 构造,它提供了一个类似 try-finally 的环境,具有一致的接口和方便的语法,例如通过“with”表达. 它通常与资源一起使用,确保在我们完成资源后始终关闭或释放资源,无论资源的使用是成功还是因异常而

  • Python 异步之如何启动获取事件循环

    目录 1. 什么是 Asyncio 事件循环 2. 如何启动和获取事件循环 3. 什么是事件循环对象 4. 为什么要访问事件循环 1. 什么是 Asyncio 事件循环 asyncio 程序的核心是事件循环.在本节中,我们将花点时间看一下 asyncio 事件循环 事件循环是用于在单个线程中执行协程的环境.事件循环是异步程序的核心. 它做了很多事情,例如: 执行协程. 执行回调. 执行网络输入/输出. 运行子进程. 事件循环是一种常见的设计模式,并且由于在 JavaScript 中的使用而在最近

  • Python中如何创建和运行异步任务详解

    目录 正文 1. 什么是异步任务 2. 如何创建任务 2.1. 高级 API 2.2. 低级 API 3. 任务何时运行? 正文 您可以从 asyncio 程序中的协程创建任务对象.任务提供独立调度和运行的协程的句柄,并允许查询.取消任务,以及稍后检索结果和异常.异步事件循环管理任务.因此,所有协程都成为事件循环中的任务并作为任务进行管理. 让我们仔细看看 asyncio 任务. 1. 什么是异步任务 异步任务是一个调度并独立运行 asyncio 协程的对象.它提供了一个调度协程的句柄,asyn

  • Python 异步之如何获取当前和正在运行任务详解

    目录 正文 1. 如何获取当前任务 2. 如何获取所有任务 正文 我们可以反省在 asyncio 事件循环中运行的任务.这可以通过为当前运行的任务和所有正在运行的任务获取一个 asyncio.Task 对象来实现. 1. 如何获取当前任务 我们可以通过 asyncio.current_task() 函数获取当前任务.此函数将为当前正在运行的任务返回一个任务对象. ... # get the current task task = asyncio.current_task() 传递给 asynci

  • Python 异步如何使用等待有时间限制协程

    目录 正文 1. 什么是 Asyncio wait_for() 2. 如何使用 Asyncio wait_for() 3. 带有超时的 Asyncio wait_for() 示例 正文 我们可以使用 asyncio.wait_for() 函数等待 asyncio 任务或协程超时完成.如果在任务完成之前超时已过,任务将被取消. 1. 什么是 Asyncio wait_for() asyncio.wait_for() 函数允许调用者等待 asyncio 任务或协程超时完成.如果没有指定超时,wait

  • Python 异步之在 Asyncio中如何运行阻塞任务详解

    目录 正文 1. 阻塞任务 2. 如何运行阻塞任务 3. 实例 正文 阻塞任务是阻止当前线程继续进行的任务. 如果在 asyncio 程序中执行阻塞任务,它会停止整个事件循环,从而阻止任何其他协程继续进行. 我们可以通过 asyncio.to_thread() 和 loop.run_in_executor() 函数在 asyncio 程序中异步运行阻塞调用. 1. 阻塞任务 asyncio的重点是异步编程和非阻塞IO.然而,我们经常需要在 asyncio 应用程序中执行阻塞函数调用. 这可能有很

  • Python 异步等待任务集合

    目录 正文 1. 什么是 asyncio.wait() 2. 如何使用 asyncio.wait() 3. 等待所有任务的示例 正文 我们可以通过 asyncio.wait() 函数等待异步任务完成.可以等待不同的条件,例如所有任务完成.第一个任务完成以及第一个任务因异常而失败. 让我们仔细看看. 1. 什么是 asyncio.wait() asyncio.wait() 函数可用于等待一组异步任务完成.回想一下,asyncio 任务是包装协程的 asyncio.Task 类的一个实例.它允许独立

  • Python 异步之推导式示例详解

    目录 引言 1. 什么是异步推导式 2. 推导式 3. 异步推导式 4. Await 推导式 引言 当我们想到“pythonic”时,理解,如列表和字典理解是 Python 的一个特性. 这是我们执行循环的一种方式,与许多其他语言不同. Asyncio 允许我们使用异步推导式. 我们可以通过“async for”表达式使用异步推导式来遍历异步生成器和异步迭代器. 1. 什么是异步推导式 异步推导式是经典推导式的异步版本.Asyncio 支持两种类型的异步推导式,它们是“async for”推导式

  • Python 异步协程函数原理及实例详解

    这篇文章主要介绍了Python 异步协程函数原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一. asyncio 1.python3.4开始引入标准库之中,内置对异步io的支持 2.asyncio本身是一个消息循环 3.步骤: (1)创建消息循环 (2)把协程导入 (3)关闭 4.举例: import threading # 引入异步io包 import asyncio # 使用协程 @ asyncio.coroutine def

  • python redis连接 有序集合去重的代码

    python redis连接 有序集合去重的代码如下所述: # -*- coding: utf-8 -*- import redis from constant import redis_ip, redis_db, redis_pw, redis_zset_name pool = redis.ConnectionPool(host=redis_ip, db=redis_db, password=redis_pw) # pool = redis.ConnectionPool(db=6, passw

  • python 异步async库的使用说明

    在学习asyncio之前,先理清楚同步/异步的概念: 同步是指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执行第二个事务,顺序执行 异步是和同步相对的,异步是指在处理调用这个事务的之后,不会等待这个事务的处理结果,直接处理第二个事务去了,通过状态.通知.回调来通知调用者处理结果 asyncio函数: 异步IO采用消息循环的模式,重复"读取消息-处理消息"的过程,也就是说异步IO模型"需要一个消息循环,在消息循环中,主线程不断地重复"

  • Python异步爬虫实现原理与知识总结

    一.背景 默认情况下,用get请求时,会出现阻塞,需要很多时间来等待,对于有很多请求url时,速度就很慢.因为需要一个url请求的完成,才能让下一个url继续访问.一种很自然的想法就是用异步机制来提高爬虫速度.通过构建线程池或者进程池完成异步爬虫,即使用多线程或者多进程来处理多个请求(在别的进程或者线程阻塞时). import time #串形 def getPage(url): print("开始爬取网站",url) time.sleep(2)#阻塞 print("爬取完成

  • Python异步爬虫多线程与线程池示例详解

    目录 背景 异步爬虫方式 多线程,多进程(不建议) 线程池,进程池(适当使用) 单线程+异步协程(推荐) 多线程 线程池 背景 当对多个url发送请求时,只有请求完第一个url才会接着请求第二个url(requests是一个阻塞的操作),存在等待的时间,这样效率是很低的.那我们能不能在发送请求等待的时候,为其单独开启进程或者线程,继续请求下一个url,执行并行请求 异步爬虫方式 多线程,多进程(不建议) 好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步会执行 弊端:不能无限制开

随机推荐