asyncio
是 Python 中用于编写并发代码的库,它使用 async/await
语法。异步生成器是 Python 3.6 引入的一个特性,允许你在 async def
函数中使用 yield
表达式。
要在异步生成器上进行“轮询”或“选择”,你可以使用 asyncio.wait
或 asyncio.as_completed
函数。以下是一个简单的例子,展示了如何使用 asyncio.as_completed
在多个异步生成器之间进行轮询:
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_1
和 async_generator_2
,它们会每隔一秒生成一个项目。poll_generators
函数会不断地从这两个生成器中获取项目并打印出来,直到两个生成器都完成。
get_next_item
是一个辅助函数,用于安全地从生成器中获取下一个项目,并在没有更多项目时返回 None
。
await asyncio.sleep(0)
语句用于让出事件循环的控制权,这样其他任务就有机会运行了。这是一种非阻塞的等待方式,它不会导致事件循环被挂起。
这个例子展示了如何在两个异步生成器之间进行简单的轮询。如果你有更多的生成器或者更复杂的逻辑,你可能需要使用 asyncio.Queue
或其他同步原语来管理生成器的输出。
参考链接:
请注意,这个例子是为了演示目的而简化的。在实际应用中,你可能需要处理更复杂的逻辑,例如错误处理、生成器的动态创建和销毁等。
领取专属 10元无门槛券
手把手带您无忧上云