У меня есть скрипт на Python с запущенным циклом событий asyncio, я хочу знать, как перебирать большой список, не блокируя цикл событий. Таким образом, поддерживая цикл в рабочем состоянии.
Я пытался создать пользовательский класс с __aiter__
и __anext__
, который не работал, я также пытался создать async function
, который дает результат, но он все еще блокирует.
В настоящее время:
for index, item in enumerate(list_with_thousands_of_items):
# do something
Пользовательский класс, который я пробовал:
class Aiter:
def __init__(self, iterable):
self.iter_ = iter(iterable)
async def __aiter__(self):
return self
async def __anext__(self):
try:
object = next(self.iter_)
except StopIteration:
raise StopAsyncIteration
return object
Но это всегда приводит к
TypeError: 'async for' received an object from __aiter__ that does not implement __anext__: coroutine
Я создал async function
, который работает, но блокирует цикл обработки событий:
async def async_enumerate(iterable, start:int=0):
for idx, i in enumerate(iterable, start):
yield idx, i