loop.create_task、asyncio.async/ensure_future 和 Task 有什么区别?

What's the difference between loop.create_task, asyncio.async/ensure_future and Task?

我对某些 asyncio 功能有点困惑。我看到有 BaseEventLoop.create_task(coro) function to schedule a co-routine. The documentation for create_task says its a new function and for compatibility we should use asyncio.async(coro) which by referring to docs again I see is an alias for asyncio.ensure_future(coro) 再次安排协同例程的执行。

与此同时,我一直在使用 Task(coro) 来安排协同例程的执行,而且似乎也能正常工作。那么,这些有什么区别呢?

如您所见,它们都做同样的事情。

asyncio.async 必须替换为 asyncio.ensure_future 因为在 Python >= 3.5 中,async 已成为关键字 [1].

create_task存在的理由[2]:

Third-party event loops can use their own subclass of Task for interoperability. In this case, the result type is a subclass of Task.

这也意味着你不应该直接创建一个Task,因为不同的事件循环可能有不同的创建"Task"的方法。

编辑

另一个重要的区别是,除了接受协程外,ensure_future还接受任何可等待的对象; create_task 另一方面只接受协程。