CodeGym /Kursy /Python SELF PL /Asynchroniczne iteratory i generatory

Asynchroniczne iteratory i generatory

Python SELF PL
Poziom 26 , Lekcja 3
Dostępny

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.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION