CodeGym /Kursy /Python SELF PL /Klasa Future

Klasa Future

Python SELF PL
Poziom 26 , Lekcja 1
Dostępny

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.

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