def to_async_iterable(iterable, maxsize = 0):
async def async_iterable():
queue = asyncio.Queue(maxsize=maxsize)
loop = asyncio.get_event_loop()
task = loop.run_in_executor(None, lambda: _consume_iterable(loop, iterable, queue))
while True:
x = await queue.get()
if x is DONE:
break
else:
yield x
await task
return async_iterable()
def _consume_iterable(loop, iterable, queue):
for x in iterable:
while True:
if not queue.full():
loop.call_soon_threadsafe(queue.put_nowait, x)
break
else:
time.sleep(TIMEOUT)
while True:
if not queue.full():
loop.call_soon_threadsafe(queue.put_nowait, DONE)
break
else:
time.sleep(TIMEOUT)
这些函数允许您从/到
iterable
<;==>;async iterable
,而不仅仅是简单的列表。基本进口
函数
^{pr2}$to_sync_iterable
将把任何异步iterable转换为sync iterable:你可以这样使用它:
函数to_async_iterable将把任何sync iterable转换为async iterable:
这个对于异步程序特别有用,因为它不会阻止事件循环,即使sync-iterable阻塞了。你可以这样使用它:
您可以使用aiostream.stream.list:
documentation中的更多运算符和示例。
您的“异步到同步”助手本身是异步的;根本没有什么大的变化。一般情况下:不,您不能使异步同步。异步值将在“以后某个时候”提供;您不能将其转换为“now”,因为该值不存在于“now”中,您将不得不异步地等待它。
相关问题 更多 >
编程相关推荐