10.1 AsyncIterator
Asynchroniczne iteratory (AsyncIterator)
pozwalają na pracę z sekwencjami danych, które produkują elementy asynchronicznie. Są używane w asynchronicznych funkcjach i korutynach do iteracji po danych, które mogą być otrzymane z opóźnieniem, na przykład z zapytań sieciowych, asynchronicznych operacji wejścia-wyjścia lub innych asynchronicznych źródeł.
Asynchroniczny iterator
Asynchroniczny iterator powinien implementować dwie metody:
Metoda __aiter__()
:
Ta metoda powinna zwracać sam asynchroniczny iterator. Jest ona analogiczna do metody __iter__()
dla synchronicznych iteratorów.
Metoda __anext__()
:
Ta metoda powinna zwracać kolejną wartość asynchronicznie lub wywołać wyjątek StopAsyncIteration
, jeśli elementy się skończyły. Jest ona analogiczna do metody __next__()
dla synchronicznych iteratorów.
Przykład:
import asyncio
class AsyncIterator:
def __init__(self, start, end):
self.current = start
self.end = end
def __aiter__(self):
return self
async def __anext__(self)(self):
if self.current >= self.end:
raise StopAsyncIteration
await asyncio.sleep(1) # Symulacja asynchronicznego opóźnienia
self.current += 1
return self.current
async def main():
async for number in AsyncIterator(1, 5):
print(number)
asyncio.run(main())
Asynchroniczne iteratory pozwalają przetwarzać dane w miarę ich otrzymywania, nie blokując wykonywania innych zadań. To jest szczególnie przydatne do pracy z zapytaniami sieciowymi i innymi asynchronicznymi operacjami.
Użycie asynchronicznych iteratorów pozwala pisać bardziej czytelny i łatwy do utrzymania kod do przetwarzania sekwencji danych asynchronicznie.
10.2 AsyncGenerator
Asynchroniczne generatory pozwalają produkować wartości asynchronicznie, używając słów kluczowych async
i await
. Działają one podobnie do zwykłych generatorów, ale mogą wstrzymywać wykonywanie, aby wykonać operacje asynchroniczne.
Tworzenie asynchronicznego generatora
Asynchroniczny generator jest definiowany z użyciem async
def
i yield
. Asynchroniczne generatory mogą używać await
w środku siebie do wykonywania operacji asynchronicznych.
Przykład:
async def async_generator():
for i in range(3):
await asyncio.sleep(1) # Asynchroniczne opóźnienie
yield i # Generowanie wartości
Użycie asynchronicznego generatora
Asynchroniczne generatory są używane wewnątrz asynchronicznych funkcji z pomocą operatora async for
.
import asyncio
async def main():
async for value in async_generator():
print(value)
asyncio.run(main())
Asynchroniczne generatory poprawiają czytelność i łatwość utrzymania kodu, pozwalając używać prostej konstrukcji składniowej async for
do pracy z asynchronicznymi sekwencjami.
GO TO FULL VERSION