8.1 Główne cechy klasy Future
Klasa Future
w module asyncio
to wynik operacji asynchronicznej, który będzie dostępny w przyszłości. Obiekty Future
są używane do zarządzania stanem i wynikami zadań asynchronicznych.
Główne cechy klasy Future
Obiekt Future
to kontener dla wyniku, który będzie dostępny później, gdy zadanie zostanie zakończone. Dostarcza interfejs do uzyskiwania wyniku lub wyjątku, które będą ustawione po zakończeniu operacji asynchronicznej.
Tworzenie i zarządzanie obiektami Future
- Tworzenie: Zwykle tworzone za pomocą
loop.create_future()
. - Ustawianie wyniku: Wynik jest ustawiany za pomocą metody
set_result(result)
. - Ustawianie wyjątku: Wyjątek jest ustawiany za pomocą metody
set_exception(exception)
.
Główne metody i atrybuty
set_result(result):
Ustawia wynik dla obiektu Future
. Wszystkie korutyny oczekujące na ten obiekt zostaną natychmiast wznowione z tym wynikiem.
set_exception(exception):
Ustawia wyjątek dla obiektu Future
. Wszystkie korutyny oczekujące na ten obiekt zostaną natychmiast wznowione z tym wyjątkiem.
result():
Zwraca wynik obiektu Future
, jeśli jest dostępny. Jeśli operacja zakończyła się wyjątkiem, wywoła ten wyjątek.
exception():
Zwraca wyjątek, jeśli został ustawiony, lub None
, jeśli obiekt Future
jeszcze się nie zakończył lub zakończył się pomyślnie.
done():
Zwraca True
, jeśli obiekt Future
jest zakończony (z wynikiem lub wyjątkiem).
add_done_callback(callback):
Dodaje callback, który zostanie wywołany po zakończeniu obiektu Future
.
8.2 Przykłady użycia
Ustawianie i pobieranie wyniku
import asyncio
async def set_future_result(fut, delay):
await asyncio.sleep(delay)
fut.set_result("Future result is ready")
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
asyncio.create_task(set_future_result(fut, 2))
result = await fut
print(result)
asyncio.run(main())
Obsługa wyjątków
import asyncio
async def set_future_exception(fut, delay):
await asyncio.sleep(delay)
fut.set_exception(ValueError("An error occurred"))
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
asyncio.create_task(set_future_exception(fut, 2))
try:
result = await fut
except ValueError as e:
print(f"Caught an exception: {e}")
asyncio.run(main())
Interakcja z zadaniami
Często obiekty Future
są używane razem z zadaniami (Tasks)
. Kiedy zadanie jest tworzone za pomocą asyncio.create_task()
, automatycznie tworzy obiekt Future
, który można użyć do śledzenia i zarządzania stanem zadania.
import asyncio
async def example_coroutine():
await asyncio.sleep(1)
return "Task result"
async def main():
task = asyncio.create_task(example_coroutine())
print(await task)
asyncio.run(main())
8.3 Zalety i cechy
Obiekty Future
pozwalają zarządzać wynikami i wyjątkami operacji asynchronicznych, zapewniając elastyczność i kontrolę nad wykonaniem. Future
można używać w różnych scenariuszach programowania asynchronicznego, w tym w zadaniach, timerach, callbackach i wiele więcej.
Często obiekty Future
są używane razem z zadaniami (Tasks)
. To podejście pozwala uzyskać wyższy poziom kontroli nad wykonaniem i stanem operacji asynchronicznych.
Ograniczenia
W niektórych przypadkach użycie Future
może być bardziej skomplikowane w porównaniu z użyciem bardziej wysokopoziomowych abstrakcji, takich jak zadania (Tasks)
lub korutyny. Przy użyciu Future
może być konieczne większe ręczne zarządzanie stanem i wynikami operacji asynchronicznych.
GO TO FULL VERSION