2015-04-27 28 views

risposta

8

Il asyncio documentation copre le differenze:

classe asyncio.Future(*, loop=None)

Questa classe è quasi compatibile con concurrent.futures.Future.

Differenze:

  • result() e exception() non prendono un argomento timeout e sollevano un'eccezione quando il futuro non è ancora finito.
  • Le chiamate registrate con add_done_callback() vengono sempre richiamate tramite il ciclo degli eventi call_soon_threadsafe().
  • Questa classe non è compatibile con le funzioni wait() e as_completed() nel pacchetto concurrent.futures.

Questa classe non è thread-safe.

In sostanza, se si sta utilizzando ThreadPoolExecutor o ProcessPoolExecutor, o si desidera utilizzare un Future direttamente per la concorrenza thread-based o basato sui processi, utilizzare concurrent.futures.Future. Se si utilizza asyncio, utilizzare asyncio.Future.

+1

Quindi non è thread-safe, a meno che non si usi 'add_done_callback()'? – sargas

+2

'asyncio.Future' non è sicuro per i thread - è progettato solo per essere utilizzato in un'applicazione basata su asyncio a thread singolo. Se vuoi chiamare un metodo su "asyncio.Future" da un thread esterno al thread del ciclo degli eventi, devi usare 'loop.call_soon_threadsafe'. – dano

2

Dal docs:

[asyncio fornisce un] classe futuro che imita quella nel modulo concurrent.futures, ma adattato per l'uso con il ciclo degli eventi;

+0

Significa che hanno funzionalità duplicate? – sargas

+0

Sì; si prega di fare riferimento alla docstring per 'asyncio.futures.Future'. – chepner

+0

Grazie, più leggo le docstring, più chiara diventa la differenza. – sargas

Problemi correlati