首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用asyncio在异步生成器上进行“轮询”或“选择”

asyncio 是 Python 中用于编写并发代码的库,它使用 async/await 语法。异步生成器是 Python 3.6 引入的一个特性,允许你在 async def 函数中使用 yield 表达式。

要在异步生成器上进行“轮询”或“选择”,你可以使用 asyncio.waitasyncio.as_completed 函数。以下是一个简单的例子,展示了如何使用 asyncio.as_completed 在多个异步生成器之间进行轮询:

代码语言:txt
复制
import asyncio

async def async_generator_1():
    for i in range(5):
        await asyncio.sleep(1)
        yield f'Generator 1 - Item {i}'

async def async_generator_2():
    for i in range(5):
        await asyncio.sleep(1)
        yield f'Generator 2 - Item {i}'

async def poll_generators():
    gen1 = async_generator_1()
    gen2 = async_generator_2()

    async def get_next_item(gen):
        try:
            return await gen.__anext__()
        except StopAsyncIteration:
            return None

    while True:
        item1 = await get_next_item(gen1)
        item2 = await get_next_item(gen2)

        if item1 is None and item2 is None:
            break

        if item1 is not None:
            print(item1)

        if item2 is not None:
            print(item2)

        await asyncio.sleep(0)  # 让出控制权,允许其他任务运行

async def main():
    await poll_generators()

# 运行事件循环
asyncio.run(main())

在这个例子中,我们定义了两个异步生成器 async_generator_1async_generator_2,它们会每隔一秒生成一个项目。poll_generators 函数会不断地从这两个生成器中获取项目并打印出来,直到两个生成器都完成。

get_next_item 是一个辅助函数,用于安全地从生成器中获取下一个项目,并在没有更多项目时返回 None

await asyncio.sleep(0) 语句用于让出事件循环的控制权,这样其他任务就有机会运行了。这是一种非阻塞的等待方式,它不会导致事件循环被挂起。

这个例子展示了如何在两个异步生成器之间进行简单的轮询。如果你有更多的生成器或者更复杂的逻辑,你可能需要使用 asyncio.Queue 或其他同步原语来管理生成器的输出。

参考链接:

请注意,这个例子是为了演示目的而简化的。在实际应用中,你可能需要处理更复杂的逻辑,例如错误处理、生成器的动态创建和销毁等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

2018年8月26日多协程编程总结

同步异步指的是消息的通信机制 (synchronous communication/ asynchronous communication) 1.所谓同步,就是调用者发出一个调用请求时,一直处于等待状态...,直到该请求得到结果 2.异步就是发出一个调用之后,不用在那一直等可以去做其他的事情,直到被调用者通过状 态来通知调用者,通过回调函数处理这个调用。...异步一般是配合非阻塞使用的,这样才 能发挥异步的效用,否则异步是没有意义的。...()     # 编译多个函数[事件]到轮询对象中     loop.run_until_complete(asyncio.gather(sing(), dance()))     # 关闭事件轮询对象...()     # 编译多个函数[事件]到轮询对象中     loop.run_until_complete(asyncio.gather(sing(), dance()))     # 关闭事件轮询对象

63630

最新的 Python 异步到底是怎么实现的?本篇为你深度解析!

for i in range(to): yield i await asyncio.sleep(delay) 详细说明 异步生成器 我们直到函数中使用一个多个 yield...重要的是提供一种保证,即使部分迭代时,也可以进行垃圾收集,生成器可以安全终止。...async with中 使用,然后使用 async for 对异步生成器对象进行迭代处理,同时我们也可以设置一个中断条件。...为了解决这个问题,这里提出以下改进建议: 1.异步生成器实现一个 aclose 方法,返回一个特殊 awaittable 对象。...PyAsyncGenWrappedValue:来自异步生成器的每个直接生成的对象都隐式地装入此结构中。 这就是生成器实现如何使用常规迭代协议从使用异步迭代协议生成的对象中分离出的对象。

1.8K21
  • PEP 525--异步生成器

    for i in range(to): yield i await asyncio.sleep(delay) 详细说明 异步生成器 我们知道函数中使用一个多个yield...重要的是提供一种保证,即使部分迭代时,也可以进行垃圾收集,生成器可以安全终止。...async with中使用,然后使用async for对异步生成器对象进行迭代处理,同时我们也可以设置一个中断条件。...为了解决这个问题,这里提出以下改进建议: 异步生成器实现一个aclose方法,返回一个特殊awaittable 对象。...PyAsyncGenWrappedValue:来自异步生成器的每个直接生成的对象都隐式地装入此结构中。 这就是生成器实现如何使用常规迭代协议从使用异步迭代协议生成的对象中分离出的对象。

    63130

    流畅的 Python 第二版(GPT 重译)(十一)

    注意 “异步生成器作为上下文管理器”展示了如何使用 Python 的contextlib创建一个异步上下文管理器,而无需编写类。由于先决主题:“异步生成器函数”,这个解释稍后本章中提供。...异步生成器只能使用空的return语句。 本地协程是可等待的:它们可以被await表达式驱动传递给许多接受可等待参数的asyncio函数,例如create_task。异步生成器不可等待。...总结一下:异步生成器表达式可以程序的任何地方定义,但只能在本地协程异步生成器函数内消耗。 PEP 530 引入的其余构造只能在本地协程异步生成器函数内定义和使用。...这些构造经常与 asyncio 一起使用,但实际它们是独立于库的。 异步超越 asyncio:Curio Python 的 async/await 语言构造与任何特定的事件循环库无关。...官方文档中,请务必阅读“使用 asyncio 进行开发”:记录了asyncio调试模式,并讨论了常见的错误和陷阱以及如何避免它们。

    21810

    WeeklyPEP-8-PEP 492-使用 async 和 await 语法的协程-overview

    本提案中,假设异步任务都使用类似内置模块 asyncio.events.AbstractEventLoop 中的事件循环进行编排和协调。...重构这些函数时,如果删除新增了 yield 相关语句就可能会导致一些不明显的错误; 只能在 yield 语法支持的地方进行异步调用,无法异步调用类似 with for 这样的语句,限制了可用性。...稍后会在提案中提及:新的 async with 语句允许 Python 程序进入退出上下文时执行异步调用,而新的 async for 语句可以迭代器中执行异步调用。...协程对象的内置方法 底层实现,协程继承自生成器共享实现代码。...asyncio 迁移策略 yield from 原生协程对象不能返回普通的生成器(点击 与生成器的不同之处 了解更多),因此建议开始使用新语法之前,确保所有生成器式协程都使用 @asyncio.coroutine

    11610

    深入Python异步编程:概念、应用场景与实践

    这种模式处理IO密集型任务时效率较低,因为大部分时间都花在等待IO操作完成。而异步编程则允许代码执行IO操作时不阻塞程序的其他部分,从而提高了程序的并发性和性能。...通过异步IO和事件驱动,可以实现即时的数据处理和分析。示例:使用asyncio进行异步编程Python标准库提供了asyncio模块,用于实现异步编程。...下面是一个简单的示例,演示如何使用asyncio进行异步IO操作:import asyncioasync def fetch_data(url): print(f"Fetching data from...异步生成器Python中的生成器(Generator)是一种特殊的迭代器,可以按需生成数据并逐个返回,从而节省内存和提高性能。而异步生成器则进一步扩展了生成器的功能,允许异步上下文中使用生成器。...接着,我们介绍了使用asyncio模块进行异步编程的基本方法,并提供了一个简单的示例来演示如何使用asyncio进行异步IO操作。

    20120

    深入理解Python异步编程(

    深入学习asyncio的基本原理和原型,了解生成器、协程Python异步编程中是如何发展的。 前言 很多朋友对异步编程都处于“听说很强大”的认知状态。鲜有在生产项目中使用它。...所以,一旦采取异步编程,每个异步调用必须“足够小”,不能耗时太久。如何拆分异步任务成了难题。 程序下一步行为往往依赖一步执行结果,如何知晓上次异步调用已完成并获取结果?...DefaultSelector类会根据 OS 环境自动选择最佳的模块,那 Linux 2.5.44 及更新的版本都是epoll了。...aio 对比生成器版的协程,使用asyncio库后变化很大: 没有了yield yield from,而是async/await 没有了自造的loop(),取而代之的是asyncio.get_event_loop...本系列教程接下来的一篇将是学习asyncio如何使用,快速掌握它的主要内容。后续我们还会深入探究asyncio的优点与缺点,也会探讨Python生态中其他异步I/O方案和asyncio的区别。

    6.9K56

    Python 协程

    直接使用 如果函数中包含yield,则这个函数就叫生成器 next调用函数,遇到yield返回 # 直接使用生成器 L = [x*x for x in range(5)] # 放在中括号中是列表生成器...for中使用 比较常用的典型生成器就是range ''' for i in ge: # for循环中使用生成器 print(i) 1 1 2 3 5 8 13 21 34 55 协程 历史历程...异常 案例v03 委派生成器 包含yield from表达式的生成器函数 委派生成器yield from表达式处暂停,调用方可以直接把数据发给子生成器生成器再把产出的值发给调用方 子生成器最后,...(tasks)) loop.close() asyn and await 为了更好的表示异步io python3.5引入 让协程代码更简洁 使用上,可以简单的进行替换 用 async 替换 @asyncio.coroutine...用 await 替换 yield from import threading # 引入异步io包 import asyncio # 使用协程 # @asyncio.coroutine async def

    1.5K127

    Python中的协程(coroutine)是什么

    本文将详细解释Python中的协程是什么,并介绍如何使用协程实现异步编程。 协程(coroutine)的概念 协程是一种特殊的函数,它可以执行过程中暂停并保存当前状态,然后需要的时候恢复执行。...使用协程实现异步编程 Python中,可以使用asyncio模块来实现协程和异步编程。asyncio提供了一组用于编写异步代码的工具和语法。...main函数中,通过await asyncio.gather()语句来同时执行多个协程。协程中,使用await asyncio.sleep()语句来模拟异步操作的耗时。...总结 协程是一种强大的工具,可以帮助我们实现高效的异步编程。Python中,协程是通过生成器实现的,可以使用asyncio模块来编写和管理协程。...使用协程可以高效利用资源、简化代码逻辑并提高代码的可维护性。 希望本文对你理解Python中的协程和如何使用协程实现异步编程有所帮助。如果有任何疑问建议,请随时提出。谢谢阅读!

    43820

    原来Python的协程有2种实现方式

    Python 3.4 引入了 asyncio 模块后,可以使用 async/await 关键字来定义协程函数,称为“原生协程”。...协程的使用场景包括网络编程、异步 I/O、数据流处理、高并发任务等。 生成器协程 Python 3 中,生成器协程(Generator Coroutine)是指使用生成器函数来实现的协程。...通过这种方式,可以使用生成器函数实现异步并发。在上面的示例中,使用生成器函数接收并打印异步 I/O 操作的结果。...下面,通过对比它们的区别和优缺点,才可以更好地理解它们之间的异同,以便选择适合自己的协程实现方式,从而更好地编写高效、可维护的异步程序。...调用方式不同:原生协程使用 await 关键字来调用,而生成器协程使用 yield from yield 语句来调用。

    45130

    Python中的并发处理之使用asyn

    本文重点: 1、了解asyncio包的功能和使用方法; 2、了解如何避免阻塞型调用; 3、学会使用协程避免回调地狱。 一、使用asyncio包做并发编程 1、并发与并行 并发:一次处理多件事。...适合asyncio API的协程定义体中必须使用yield from,而不能使用yield。 使用asyncio处理的协程,需定义体使用@asyncio.coroutine装饰。...协程中使用yield from需要注意两点: 使用yield froml链接的多个协程最终必须由不是协程的调用方驱动,调用方显式隐式最外层委派生成器上调用next()函数 .send()方法。...链条中最内层的子生成器必须是简单的生成器(只使用yield)或可迭代的对象。...使用多线程处理大量连接时将耗费过多的内存,故此通常使用回调来实现异步调用。

    92410

    Python 异步: 协程(4)

    它提供了用于运行协程和开发异步程序的“asyncio”模块。本节中,我们将更深入地了解协程。1. 什么是协程协程是一个可以挂起和恢复的函数。它通常被定义为通用子程序。...它们可以控制何时挂起和恢复,从而允许它们并发任务执行时进行合作。这称为协作式多任务处理,不同于通常与线程一起使用的多任务处理,称为抢占式多任务处理。...抢占式多任务涉及操作系统选择暂停和恢复哪些线程以及何时这样做,而不是协作多任务的情况下由任务自己决定。现在我们对什么是协程有了一些了解,让我们通过将它们与其他熟悉的编程结构进行比较来加深这种理解。...生成器函数将返回一个可以遍历的生成器迭代器对象,例如通过 for 循环。每次执行生成器时,它都会从上一次挂起的点运行到下一个 yield 语句。协程可以使用“await”表达式挂起屈服于另一个协程。...协程一个线程内执行,因此一个线程可以执行多个协程。6. 协程与进程协程比进程更轻量级。事实,线程比进程更轻量级。进程是计算机程序。它可能有一个多个线程。

    82520

    Python 异步: 协程(4)

    它提供了用于运行协程和开发异步程序的“asyncio”模块。 本节中,我们将更深入地了解协程。 1. 什么是协程 协程是一个可以挂起和恢复的函数。它通常被定义为通用子程序。...它们可以控制何时挂起和恢复,从而允许它们并发任务执行时进行合作。这称为协作式多任务处理,不同于通常与线程一起使用的多任务处理,称为抢占式多任务处理。...协程可以使用“await”表达式挂起屈服于另一个协程。一旦等待的协同程序完成,它将从这一点恢复。我们可能会将生成器视为循环中使用的一种特殊类型的协程和协作多任务处理。...协程一个线程内执行,因此一个线程可以执行多个协程。 6. 协程与进程 协程比进程更轻量级。事实,线程比进程更轻量级。进程是计算机程序。它可能有一个多个线程。...协程被定义为使用 @asyncio.coroutine 装饰器的函数。协程是通过 asyncio 模块使用 asyncio 事件循环执行的。

    62430

    Python:从头创建 Asyncio (2)

    我探索 asyncio 的过程中,我起初并不太明白它的工作原理。但随着深入学习,我意识到 asyncio 实际 Python 生成器的基础增加了一层非常便利的封装。...本文[1]中,我将展示如何仅用 Python 生成器来构建一个 asyncio 的简化模型。接着,我会演示如何利用 await 魔法方法,将示例代码改写为使用 async 和 await 关键字。...我们还可以协程前使用 await,协程是函数定义时加上 async 关键字生成的对象。协程和生成器函数类似,它们的执行都能够被挂起和恢复。...实际,你甚至可以查看 Asyncio 的源代码,发现 Future 对象中的 _await__ 方法调用时,如果未来(任务)尚未完成,它基本只是执行了 yield 操作。...接下来,我们需要对 sleep 函数进行异步兼容改造。之前,我们通过一个带有 while 循环和单个 yield 的生成器函数来实现休眠功能。

    9310

    python基础教程:异步IO 之 概念和历史

    并发的方式有多种,多线程,多进程,异步IO等。多线程和多进程更多应用于CPU密集型的场景,比如科学计算的时间都耗费CPU,利用多核CPU来分担计算任务。...这就导致,IO密集型的场景99%以上的时间都花费IO等待的时间异步IO就是把CPU从漫长的等待中解放出来的方法。这就可以大大提高我们写的软件系统的并发性。...从而使得异步编程更加简洁,并和普通的生成器区别开来。 注意: 对基于生成器的协程的支持已弃用,并计划在 Python 3.10 中移除。...所以,写异步IO程序时只需使用 async 和 await 即可。 Python 3.7 又进行了优化,把API分组为高层级API和低层级API。 我们先看看下面的代码,发现与上面的有什么不同? ?...从上面关于 asyncio 的发展来看它一直变化,3.4,3.5,3.6, 3.7 都有很多细节的变化。

    66030

    我实在不懂Python的Asyncio

    __aiter__和__anext__,用来实现异步的迭代器(异步循环,和异步解析式).另外这个协议更改过。3.5中,它返回awaitable。3.6中,它返回异步生成器。...下面是我猜想它如何工作的: 如果你主线程,那么事件循环会在你调用asyncio.get_event_loop()的时候被创建。...3.x初始版本中,asyncio还没有得到语言层面支持,所以需要使用装饰器+生成器的方式来编写协程。为了实现yield from, StopIteration会过载多次。...3.6中,异步生成器现在还会抛出AsyncStopIteration。...如何使用Asyncio 现在我们粗略的理解了asyncio,另外我找到一些人们编写asyncio代码的常见模式: 将loop传入所有的协程。社区中相当一部分的人都是这么做的。

    1.3K20

    python进阶之异步任务

    0.导语1.yield关键字2.异步加载asyncio第一种方式第二种方式 python进阶之异步任务 0.导语 本文学习视频来自莫凡python,下面是总结的学习内容。...关于星球,我稍微阐述一点,我用自己的精力星球中发布小项目,发布日打卡,共同来学习某一块知识,所以改为收费模式,希望通过收费可以筛选出一波真正想学习的人,共同坚持,就像公众号一样,屹立不倒,昨天立了个...flag,每日分享一条消息文字技术,共同坚持学习!...1.yield关键字 yield类似于return, 但不同之处在于它返回的是生成器生成器 生成器是通过一个多个yield表达式构成的函数。...asyncio asyncioasyncio可以实现单线程并发IO操作 async和await是针对coroutine的新语法,要使用新的语法,只需要做两步简单的替换: 把@asyncio.coroutine

    43820

    Python与协程从Python2—Python3

    之前是没有选择,很多人选择了Gevent,而现在明确的有了更正统的、正确的选择asyncio(下一节会介绍)。所以建议大家了解Gevent,拥抱asyncio。...Python3中的协程 Gvanrossum希望Python 3 实现一个原生的基于生成器的协程库,其中直接内置了对异步IO的支持,这就是asyncio,它在Python 3.4被引入到标准库。...下面将简单介绍asyncio使用: 1)event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数注册到事件循环。当满足事件发生的时候,调用相应的协程函数。...使用async可以定义协程对象,使用await可以针对耗时的操作进行挂起,就像生成器里的yield一样,函数让出控制权。...我们使用asyncio.sleep函数来模拟IO操作。协程的目的也是让这些IO操作异步化。

    99310

    【Python100天学习笔记】Day20 迭代器与生成器及 并发编程

    生成器对象可以使用send()方法发送数据,发送的数据会成为生成器函数中通过yield表达式获得的值。这样,生成器就可以作为协程使用,协程简单的说就是可以相互协作的子程序。...程序会花费大量时间I/O操作,没有太多并行计算的需求且不需占用太多的内存。 以下情况需要使用多进程: 程序执行计算密集型任务(如:字节码操作、数据处理、科学计算)。...Python 3通过asyncio模块和await和async关键字(Python 3.7中正式被列为关键字)来支持异步处理。...当程序不需要真正的并发性并行性,而是更多的依赖于异步处理和回调时,asyncio就是一种很好的选择。...要实现任务的异步化,可以使用名为Celery的三方库。Celery是Python编写的分布式任务队列,它使用分布式消息进行工作,可以基于RabbitMQRedis来作为后端的消息代理。

    39110
    领券