CodeGym /Kursy /Python SELF PL /Popularne metody asyncio

Popularne metody asyncio

Python SELF PL
Poziom 25 , Lekcja 3
Dostępny

4.1 Metoda run()

Moduł asyncio dostarcza mnóstwo metod i funkcji do tworzenia i zarządzania asynchronicznymi programami. Oto niektóre z najpopularniejszych i najczęściej używanych metod i funkcji modułu asyncio.

Dzisiaj przyjrzymy się 4 najczęstszym:

  • run()
  • sleep()
  • wait()
  • gather()

A teraz szczegóły:

Metoda asyncio.run(coroutine)

Ta metoda jest używana do uruchamiania programu asynchronicznego. Jest szczególnie przydatna, gdy chcesz uruchomić kod asynchroniczny z synchronicznego kontekstu, na przykład z głównego wątku programu.

Metoda asyncio.run() uruchamia główną korutinę i zarządza tworzeniem i zamykaniem pętli zdarzeń. Ta metoda automatycznie tworzy nową pętlę zdarzeń i kończy ją po zakończeniu wykonywania korutiny.

Sygnatura:


asyncio.run(async_function(), *, debug=False)
        
  • async_function: Korutyna, którą należy wykonać.
  • debug: Opcjonalny parametr, włączający tryb debugowania dla pętli zdarzeń.

Przykład użycia:


import asyncio

async def main():
    print('Hello')
    await asyncio.sleep(1)
    print('World')
            
asyncio.run(main())
        

Ograniczenia

Nie może być wywołana wewnątrz innej pętli zdarzeń:

asyncio.run() powinno być wywoływane tylko z kodu synchronicznego, ponieważ tworzy i kończy własną pętlę zdarzeń. Próba wywołania jej wewnątrz istniejącej pętli zdarzeń spowoduje błąd.

Pasuje tylko do najwyższego poziomu:

Ta metoda jest przeznaczona do uruchamiania głównego wejścia do programu i nie powinna być używana do zagnieżdżonych wywołań funkcji asynchronicznych.

4.2 Metoda sleep()

Ta metoda jest używana, gdy musisz wstrzymać wykonanie korutiny na określony czas, nie blokując przy tym wykonania innych korutin.

Metoda asyncio.sleep() w module asyncio jest używana do wstrzymywania wykonywania aktualnej korutiny na określoną liczbę sekund.

Ta metoda różni się od podobnej metody time.sleep() tym, że pozwala innym zadaniom wykonywać się podczas wstrzymania. To czyni ją przydatną do pisania asynchronicznych programów, które wymagają opóźnień lub oczekiwania bez blokowania głównego wątku.

Sygnatura:


asyncio.sleep(delay, result=None)
        
  • delay: Czas wstrzymania w sekundach (może być liczba zmiennoprzecinkowa).
  • result: Opcjonalny wynik, który zostanie zwrócony po zakończeniu wstrzymania.

Przykład zastosowania:


import asyncio

async def main():
    print('Start sleeping')
    await asyncio.sleep(2)
    print('Wake up')
            
asyncio.run(main())
        

W tym przykładzie korutyna main wstrzymuje się na 2 sekundy, pozwalając innym zadaniom wykonywać się w tym czasie, a następnie kontynuuje i wypisuje "Wake up".

4.3 Metoda wait()

Ta metoda jest przydatna, gdy musisz poczekać na zakończenie kilku operacji asynchronicznych, ale chcesz mieć większą kontrolę nad procesem oczekiwania.

Metoda asyncio.wait() w module asyncio pozwala czekać na zakończenie kilku zadań asynchronicznych lub korutin. Można czekać na zakończenie wszystkich zadań, pierwszego zakończonego zadania lub zakończenia dowolnego zadania z błędem.

W przeciwieństwie do gather(), metoda wait() daje więcej kontroli nad procesem oczekiwania, umożliwiając ustawienie timeout i warunków zakończenia.

Podstawowe cechy metody asyncio.wait()

Sygnatura:


asyncio.wait(fs, *, timeout=None, return_when=ALL_COMPLETED)
        

Gdzie:

  • fs: Kolekcja obiektów Future lub korutin, które należy oczekiwać.
  • timeout: Opcjonalny parametr, określający maksymalny czas oczekiwania w sekundach. Jeśli czas oczekiwania upłynie, metoda zwróci te zadania, które zostały zakończone do tego momentu.
  • return_when: Warunek, określający, kiedy metoda powinna się zakończyć. Możliwe wartości:
    • ALL_COMPLETED: Metoda zwraca wynik, gdy wszystkie zadania zostaną zakończone (domyślnie).
    • FIRST_COMPLETED: Metoda zwraca wynik, gdy zakończy się pierwsze zadanie.
    • FIRST_EXCEPTION: Metoda zwraca wynik, gdy jakiekolwiek zadanie zakończy się wyjątkiem.

Oczekuje na zakończenie kilku zadań lub korutin. Można określić czas oczekiwania i warunki zakończenia.


import asyncio

async def say(what, delay):
    await asyncio.sleep(delay)
    return what
            
async def main():
    task1 = asyncio.create_task(say('hello', 1)) 
    task2 = asyncio.create_task(say('world', 2))
    done, pending = await asyncio.wait([task1, task2], timeout=1.5)
    for task in done:
        print(task.result())
            
asyncio.run(main())
        

W powyższym przykładzie każdą korutinę say() zamykamy w obiekt Task za pomocą wywołania metody create_task(), a następnie przekazujemy listę tych tasków do metody wait(). Obiekty Task pozwalają wykonywać korutiny równolegle, nie czekając na zakończenie jednej przed uruchomieniem innej.

Metoda wait będzie czekać na wykonanie zadań tylko półtorej sekundy, po czym zwróci krotkę tasków: pierwsza wartość krotki będzie zawierała zadania, które zdążyły się wykonać (done), druga — które są jeszcze w trakcie (pending).

4.4 Metoda gather()

Ta metoda jest szczególnie przydatna, gdy musisz uruchomić kilka asynchronicznych operacji równolegle i uzyskać ich wyniki w postaci listy.

Metoda asyncio.gather() w module asyncio służy do wykonywania kilku zadań asynchronicznych równolegle i zwracania ich wyników w postaci listy. To wygodny sposób na grupowanie korutin lub zadań i oczekiwanie na ich zakończenie.

Podstawowe cechy metody asyncio.gather()

Sygnatura:


asyncio.gather(*coros_or_futures, return_exceptions=False)
        

Gdzie:

  • coros_or_futures: Korutiny lub obiekty Future, które mają być wykonane.
  • return_exceptions: Wartość logiczna, wskazująca, czy wyjątki mają być zwracane jako wyniki. Domyślnie False.

Przykład użycia


import asyncio

async def say_after(delay, what):
    await asyncio.sleep(delay)
    return what
            
async def main():
    results = await asyncio.gather(
        say_after(1, 'hello'),
        say_after(2, 'world')
    )
    print(results)
            
asyncio.run(main())
        

Ten przykład pokazuje, jak asyncio.gather może być używany do równoczesnego wykonywania kilku zadań, z których każde ma swoje opóźnienie. Wyniki wszystkich zadań są zwracane w postaci listy. W przeciwieństwie do wait, gather nie tylko oczekuje zakończenia zadań, ale także zbiera wyniki wszystkich korutin, co czyni go wygodnym w przypadku, gdy ważny jest wynik wykonania każdego zadania.

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