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
Fertig
ticker()
ist ein async Generator, bereitsAsyncIterable
undAsyncIterator
.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
anext
die AusnahmeStopAsyncIteration
(wienext
die AusnahmeStopIteration
wirft).
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
leer
Wichtige Details:
__aiter__
muss direkt einen asynchronen Iterator liefern (kein Awaitable).anext(it, default)
gibt bei Erschöpfungdefault
zurück, anstattStopAsyncIteration
zu werfen.