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
另一方面只接受协程。
我对某些 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
另一方面只接受协程。