2015-04-27 3 views

Antwort

8

Die asyncio documentation deckt die Unterschiede:

Klasse asyncio.Future(*, loop=None)

Diese Klasse ist fast mit concurrent.futures.Future kompatibel.

Unterschiede:

  • result() und exception() Sie ein Timeout Argument nicht nehmen und eine Ausnahme auslösen, wenn die Zukunft noch nicht geschehen ist.
  • Rückrufe, die mit add_done_callback() registriert sind, werden immer über die Ereignisschleife call_soon_threadsafe() aufgerufen.
  • Diese Klasse ist nicht mit den Funktionen wait() und as_completed() im concurrent.futures-Paket kompatibel.

Diese Klasse ist nicht threadsicher.

Grundsätzlich, wenn Sie ThreadPoolExecutor oder ProcessPoolExecutor verwenden, oder einen Future direkt für Thread-basierte oder prozessbasierten Parallelität verwenden möchten, verwenden Sie concurrent.futures.Future. Wenn Sie asyncio verwenden, verwenden Sie asyncio.Future.

+1

Also ist es nicht threadsicher, es sei denn du benutzt 'add_done_callback()'? – sargas

+2

'asyncio.Future' ist überhaupt nicht Thread-sicher - es wurde nur für die Verwendung in einer asyncio-basierten Single-Thread-Anwendung entwickelt. Wenn Sie eine Methode für 'asyncio.Future' von einem Thread außerhalb des Ereignis-Loop-Threads aufrufen möchten, müssen Sie' loop.call_soon_threadsafe' verwenden. – dano

2

Vom docs:

[asyncio stellt a] Zukunft Klasse, die eine in der concurrent.futures Modul nachahmt, aber für die Verwendung mit der Ereignisschleife ausgelegt ist;

+0

Bedeutet das, dass sie Funktionalität dupliziert haben? – sargas

+0

Ja; Bitte beachten Sie den Docstring für 'asyncio.futures.Future'. – chepner

+0

Danke, je mehr ich die Docstrings lese, desto deutlicher wird der Unterschied. – sargas

Verwandte Themen