2015-04-27 32 views

Odpowiedz

8

The asyncio documentation obejmuje różnice:

klasa asyncio.Future(*, loop=None)

Ta klasa jest prawie zgodny z concurrent.futures.Future.

Różnice:

  • result() i exception() nie przyjmują argument limitu czasu i podnieść wyjątek, gdy przyszłość nie jest jeszcze zrobione.
  • Połączenia zwrotne zarejestrowane pod numerem add_done_callback() są zawsze wywoływane za pośrednictwem pętli zdarzeń call_soon_threadsafe().
  • Ta klasa nie jest zgodna z funkcjami wait() i as_completed() w pakiecie concurrent.futures.

Ta klasa nie jest bezpieczna dla wątków.

Zasadniczo, jeśli używasz ThreadPoolExecutor lub ProcessPoolExecutor, lub chcą używać Future bezpośrednio do współbieżności wątku opartych lub procesowego opartego używać concurrent.futures.Future. Jeśli używasz asyncio, użyj asyncio.Future.

+1

Więc to nie jest wątek bezpieczny, chyba że używasz 'add_done_callback()'? – sargas

+2

'asyncio.Future' nie jest w ogóle bezpieczny dla wątków - jest przeznaczony tylko do stosowania w jednowątkowej aplikacji opartej na" asyncio ". Jeśli chcesz wywołać metodę na 'asyncio.Future' z wątku poza wątkiem pętli zdarzeń, musisz użyć' loop.call_soon_threadsafe'. – dano

2

Z docs:

[asyncio dostarcza] Klasa przyszłości, która naśladuje jedną w module concurrent.futures, ale przystosowane do użycia z pętli zdarzeń;

+0

Czy to oznacza, że ​​mają powieloną funkcjonalność? – sargas

+0

Tak; zapoznaj się z dokumentacją dla 'asyncio.futures.Future'. – chepner

+0

Dzięki temu, im więcej czytam docstrukcji, tym wyraźniejsza jest różnica. – sargas