python-3.x - 如何从异步迭代器中获取常规迭代器?
问题描述
有一个异步迭代。需要一个常规的迭代。
asyc def aiter2iter(aiter):
l = []
async for chunk in aiter:
l.append(chunk)
return l
regular_iterable = await aiter2iter(my_async_iterable)
for chunk in regular_iterable:
print('Hooray! No async required here!')
这是要走的路还是我在重新发明轮子?
Python是否提供了将异步迭代转换为常规迭代的任何方法?
我写的也正确吗?我没有错过什么吗?
解决方案
你的方法没问题。unsync
在异步/同步函数之间工作时,我也会尝试。
给定
import time
import random
import asyncio
from unsync import unsync
# Sample async iterators
class AsyncIterator:
"""Yield random numbers."""
def __aiter__(self):
return self
async def __anext__(self):
await asyncio.sleep(0.1)
return random.randint(0, 10)
async def anumbers(n=10):
"""Yield the first `n` random numbers."""
i = 0
async for x in AsyncIterator():
if i == n:
return
yield x
i +=1
代码
与其等待和重复结果,我们可以调用result()
:
@unsync
async def aiterate(aiter):
"""Return a list from an aiter object."""
return [x async for x in aiter]
aiterate(anumbers(5)).result()
# [8, 2, 5, 8, 9]
细节
这是来自 Python Byte 的第 73 集的描述:
您只需使用任何异步函数,然后放置一个
@unsync
装饰器。...它基本上会把它包装起来并做所有异步初始化的东西......然后你可以等待结果,或者不等待结果,但是你喜欢。...那么如果你把它放在一个常规函数上,而不是一个异步函数上,它会导致它在线程池线程上运行,在线程池执行器上。
推荐阅读
- c++ - 从已存储派生类的基类的向量将 unique_ptr 实例化为派生类
- php - 传递参数来构造
- javascript - 如何将文件传递给 Django 中的 js 函数?
- mongodb - 遍历 mongo 文档数组并获取嵌套数组属性的计数?
- php - 具有负载平衡器的 Office 365 集成
- javascript - 如何使用 HTML 禁用 Fiori UI5 应用程序中的按钮
- android - 用另一个 childFragment 替换 childFragment 将视图放在顶部
- reactjs - PWA 中的 iphone 启动画面无法正常工作
- android - 如何在 android things 应用程序上获得语音识别?
- login - 部署阶段因 cf 登录失败:使用不正确