¿Cuál es la diferencia entre loop.create_task, asyncio.async / asegurar_future y Task?

Estoy un poco confundido por algunas funciones asyncio . Veo que hay una función BaseEventLoop.create_task(coro) para progtwigr una co-rutina. La documentación para create_task dice que es una nueva función y, por compatibilidad, deberíamos usar asyncio.async(coro) que al referirme a los documentos nuevamente que veo es un alias para asyncio.ensure_future(coro) que nuevamente progtwig la ejecución de una co-rutina.

Mientras tanto, he estado usando Task(coro) para progtwigr la ejecución de la co-rutina y eso también parece estar funcionando bien. Entonces, ¿cuál es la diferencia entre todos estos?

Como habrás notado, todos hacen lo mismo.

asyncio.async tuvo que ser reemplazado por asyncio.ensure_future porque en Python> = 3.5, async se ha convertido en una palabra clave [1] .

La razón de ser de create_task [2] :

Los bucles de eventos de terceros pueden usar su propia subclase de Tarea para la interoperabilidad. En este caso, el tipo de resultado es una subclase de Tarea.

Y esto también significa que no debe crear una Task directamente, ya que diferentes bucles de eventos pueden tener diferentes formas de crear una “tarea”.

Editar

Otra diferencia importante es que, además de aceptar coroutines, ensure_future también acepta cualquier objeto que se pueda esperar; create_task por otro lado solo acepta coroutines.