web-dev-qa-db-fra.com

Quelle est la différence entre loop.create_task, asyncio.async / Ensure_future et Task?

Je suis un peu confus par certaines fonctions asyncio. Je vois qu'il y a une fonction BaseEventLoop.create_task(coro) pour planifier une co-routine. La documentation de create_task Dit que c'est une nouvelle fonction et pour des raisons de compatibilité, nous devons utiliser asyncio.async(coro) qui, en se référant à nouveau aux documents, je vois est un alias pour asyncio.ensure_future(coro) qui planifie à nouveau l'exécution d'une co-routine.

Pendant ce temps, j'utilise Task(coro) pour planifier l'exécution en co-routine et cela semble également fonctionner correctement. alors, quelle est la différence entre tout cela?

31
Elektito

Comme vous l'avez remarqué, ils font tous la même chose.

asyncio.async devait être remplacé par asyncio.ensure_future car dans Python> = 3.5, async est devenu un mot clé [1] .

create_task's raison d'être [2] :

Les boucles d'événements tierces peuvent utiliser leur propre sous-classe de tâche pour l'interopérabilité. Dans ce cas, le type de résultat est une sous-classe de Task.

Et cela signifie également que vous ne devez pas créer directement un Task, car différentes boucles d'événements peuvent avoir différentes manières de créer une "tâche".

Modifier

Une autre importante différence est qu'en plus d'accepter les coroutines, ensure_future accepte également tout objet attendu; create_task d'autre part accepte seulement les coroutines.

22
Jashandeep Sohi