首页
学习
活动
专区
工具
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 或其他同步原语来管理生成器的输出。

参考链接:

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

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

相关·内容

领券