aiter()
Die Python-Funktion aiter() ist eine eingebaute Funktion, die einen asynchronen Iterator aus einem asynchronen iterierbaren Objekt erzeugt. Sie ermöglicht die effiziente Verarbeitung von Datenströmen und asynchronen Quellen, indem sie das Iterieren über Objekte im asynchronen Kontext vereinfacht. aiter() ist besonders nützlich bei der Arbeit mit asynchronen Generatoren und unterstützt moderne Programmiermuster für nebenläufige und ereignisgesteuerte Anwendungen.
Inhaltsverzeichnis
Einführung
Die Funktion aiter() liefert einen asynchronen Iterator aus einem asynchronen Iterable - also genau das, was async for intern benötigt. In alltäglichem Code nutzt man meist direkt async for. Die Funktion aiter() braucht man dann, wenn man Iteration manuell steuern möchte.
Sobald man in Python asynchron iteriert (Datenströme, Netzwerk, zeitverzögerte Events), reichen normale Iteratoren (iter, next) nicht aus, weil das Abrufen des nächsten Elements warten (awaiten) muss. aiter() standardisiert den ersten Schritt: Aus einem asynchronen Iterable einen asynchronen Iterator machen - äquivalent zu obj.__aiter__().
Syntax
aiter(async_iterable)async_iterable
Ein Objekt, das die asynchrone Iterationsprotokoll-Methode __aiter__(self) bereitstellt.
Konzeptionelle Typen (PEP-484)
from typing import AsyncIterable, AsyncIterator, TypeVar
T = TypeVar("T")
def aiter(async_iterable: AsyncIterable[T] -> AsyncIterator[T]): ...Rückgabewert
Ein asynchroner Iterator (ein Objekt mit __anext__), der mit await anext(iterator) oder in async for konsumiert werden kann.
Wichtig: aiter() selbst ist nicht await-bar. Es liefert sofort das Iteratorobjekt.
Beispiele
Asynchroner Generator
import asyncio
async def ticker(n):
for i in range(n):
await asyncio.sleep(0.1)
yield i
async def main():
async_iterator = aiter(ticker(3))
from builtins import anext
try:
print(await anext(async_iterator))
print(await anext(async_iterator))
print(await anext(async_iterator))
print(await anext(async_iterator))
except StopAsyncIteration:
print("Fertig")
asyncio.run(main())0
1
2
Fertigticker()ist ein async Generator, bereitsAsyncIterableundAsyncIterator.aiter(ticker(3))gibt einen Iterator zurück, den man mitawait anext(async_iterator)Stück für Stück konsumiert.- Ist er leer, wirft
anextdie AusnahmeStopAsyncIteration(wienextdie AusnahmeStopIterationwirft).
Eigener asynchroner Iterator (Klasse)
import asyncio
class CountDown:
def __init__(self, start: int):
self.current = start
def __aiter__(self):
return self
async def __anext__(self):
if self.current <= 0:
raise StopAsyncIteration
await asyncio.sleep(0.05)
self.current -= 1
return self.current
async def main():
count_down_iter = aiter(CountDown(3))
from builtins import anext
print(await anext(count_down_iter))
print(await anext(count_down_iter))
print(await anext(count_down_iter))
print(await anext(count_down_iter, "leer"))
asyncio.run(main())2
1
0
leerWichtige Details:
__aiter__muss direkt einen asynchronen Iterator liefern (kein Awaitable).anext(it, default)gibt bei Erschöpfungdefaultzurück, anstattStopAsyncIterationzu werfen.