2015-11-29 12 views
26

Sono un po 'confuso da alcune funzioni di asyncio. Vedo che c'è la funzione BaseEventLoop.create_task(coro) per programmare un co-routine. La documentazione per create_task dice che è una nuova funzione e per compatibilità dovremmo usare asyncio.async(coro) che facendo riferimento a documenti di nuovo vedo un alias per asyncio.ensure_future(coro) che pianifica di nuovo l'esecuzione di una co-routine.Qual è la differenza tra loop.create_task, asyncio.async/ensure_future e Task?

Nel frattempo, ho utilizzato Task(coro) per pianificare l'esecuzione di co-routine e anche questo sembra funzionare correttamente. quindi, qual è la differenza tra tutti questi?

risposta

19

Come hai notato, fanno tutti la stessa cosa.

asyncio.async ha dovuto essere sostituito con asyncio.ensure_future perché in Python> = 3.5, async è stato fatto una parola chiave [1].

s' create_task ragion d'essere [2]:

loop di eventi di terze parti possono utilizzare la propria sottoclasse di attività per l'interoperabilità. In questo caso, il tipo di risultato è una sottoclasse di Attività.

E questo significa anche che non si dovrebbe creare un Task direttamente, perché diversi cicli di eventi potrebbero avere diversi modi di creare un "compito".

Modifica

Un'altra importante differenza è che, oltre a coroutine accettare, ensure_future accetta anche qualsiasi oggetto awaitable; create_task d'altra parte accetta solo coroutine.

+0

Sembra che farei meglio a usare "ensure_future". Grazie per il chiarimento. – Elektito

+1

A meno che non si scriva codice per Python <3.4.4, ovviamente;) –

+0

Ah, sì. Non ho prestato attenzione! Sto _am_ usando Python <3.4.4 come succede; 3.4.3 per essere precisi. – Elektito

Problemi correlati