有一个异步可迭代的。需要定期迭代。
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是否提供任何方式将异步可迭代项转换为常规可迭代项?
我写的还正确吗?我没错过什么吗?
答案 0 :(得分:0)
您的方法正常。在异步/同步功能之间工作时,我也会尝试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字节的episode 73的说明:
您只需采用任何异步功能,然后放置一个
@unsync
装饰器。 ...它基本上会把它包装起来并完成所有异步初始化工作...然后您可以等待结果,也可以不等待结果,但是可以随意。 ...然后,如果将其放在常规函数而非异步函数上,它将导致它在线程池执行器上的线程池线程上运行。