Ответ 1
Как вы заметили, все они делают то же самое.
asyncio.async
пришлось заменить на asyncio.ensure_future
, потому что в Python >= 3.5, async
было создано ключевое слово [1].
create_task
raison d'etre [2]:
Контуры сторонних событий могут использовать свой собственный подкласс Task для взаимодействия. В этом случае тип результата является подклассом Task.
И это также означает, что вы не должны создавать Task
напрямую, потому что разные циклы событий могут иметь разные способы создания "задачи".
Edit
Другим важным отличием является то, что в дополнение к принятию сопрограммы ensure_future
также принимает любой ожидаемый объект; create_task
, с другой стороны, просто принимает сопрограммы.