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ówFuture
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 obiektyFuture
, które mają być wykonane. -
return_exceptions
: Wartość logiczna, wskazująca, czy wyjątki mają być zwracane jako wyniki. DomyślnieFalse
.
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.
GO TO FULL VERSION