2015-11-29 10 views
26

Ich bin ein wenig verwirrt durch einige asyncio Funktionen. Ich sehe, es gibt BaseEventLoop.create_task(coro) Funktion, um eine Co-Routine zu planen. Die Dokumentation für create_task sagt, es ist eine neue Funktion und für die Kompatibilität sollten wir asyncio.async(coro) verwenden, die durch Verweis auf Dokumente wieder ich sehe, ist ein Alias ​​für asyncio.ensure_future(coro), die wiederum die Ausführung einer Co-Routine einplant.Was ist der Unterschied zwischen loop.create_task, asyncio.async/sure_future und Task?

In der Zwischenzeit habe ich Task(coro) für die Planung Co-Routine-Ausführung verwendet und das scheint auch gut zu funktionieren. Also, was ist der Unterschied zwischen all diesen?

Antwort

19

Wie Sie bemerkt haben, machen alle dasselbe.

asyncio.async hatte mit asyncio.ensure_future ersetzt werden, weil in Python> = 3.5, hat async ein Schlüsselwort [1] gemacht worden.

create_task ‚s raison d'etre [2]:

Third-Party-Event Loops können ihre eigene Unterklasse von Aufgaben für die Interoperabilität verwenden. In diesem Fall ist der Ergebnistyp eine Unterklasse von Task.

Und dies auch bedeutet, dass Sie nicht ein Task direkt erstellen, weil verschiedene Ereignisschleifen verschiedene Möglichkeiten haben könnten eine „Aufgabe“ zu schaffen.

bearbeiten

Ein weiterer wichtig Unterschied besteht darin, dass zu akzeptieren Koroutinen zusätzlich ensure_future auch jede awaitable Objekt akzeptiert; create_task auf der anderen Seite akzeptiert nur Koroutinen.

+0

Klingt, als würde ich 'secure_future' dann besser verwenden. Danke für die Klärung. – Elektito

+1

Es sei denn, Sie schreiben Code für Python <3.4.4, natürlich;) –

+0

Ah, ja. Ich habe nicht aufgepasst! Ich benutze Python <3.4.4, wie es passiert; 3.4.3 um genau zu sein. – Elektito