From 921d87304f1582d4de341ca8b1259595c0ab8ef9 Mon Sep 17 00:00:00 2001 From: Dan <14043624+delivrance@users.noreply.github.com> Date: Thu, 10 Feb 2022 01:08:11 +0100 Subject: [PATCH] Do not consume async gens, turn them to gens instead --- pyrogram/sync.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/pyrogram/sync.py b/pyrogram/sync.py index 6db937b3..a3e0d2b5 100644 --- a/pyrogram/sync.py +++ b/pyrogram/sync.py @@ -30,8 +30,23 @@ def async_to_sync(obj, name): function = getattr(obj, name) main_loop = asyncio.get_event_loop() - async def consume_generator(coroutine): - return types.List([i async for i in coroutine]) + def async_to_sync_gen(agen, loop, is_main_thread): + async def anext(agen): + try: + return await agen.__anext__(), False + except StopAsyncIteration: + return None, True + + while True: + if is_main_thread: + item, done = loop.run_until_complete(anext(agen)) + else: + item, done = asyncio.run_coroutine_threadsafe(anext(agen), loop).result() + + if done: + break + + yield item @functools.wraps(function) def async_to_sync_wrap(*args, **kwargs): @@ -51,7 +66,7 @@ def async_to_sync(obj, name): return loop.run_until_complete(coroutine) if inspect.isasyncgen(coroutine): - return loop.run_until_complete(consume_generator(coroutine)) + return async_to_sync_gen(coroutine, loop, True) else: if inspect.iscoroutine(coroutine): if loop.is_running(): @@ -66,7 +81,7 @@ def async_to_sync(obj, name): if loop.is_running(): return coroutine else: - return asyncio.run_coroutine_threadsafe(consume_generator(coroutine), main_loop).result() + return async_to_sync_gen(coroutine, main_loop, False) setattr(obj, name, async_to_sync_wrap)