loop.create_task,asyncio.async / ensure_future和Task之间有什么区别?

时间:2015-11-29 06:30:45

标签: python python-3.x coroutine python-asyncio

我对一些asyncio函数感到有些困惑。我看到有BaseEventLoop.create_task(coro)函数可以安排一个协同例程。 create_task的文档说它是一个新函数,为了兼容性,我们应该使用asyncio.async(coro)通过再次引用文档,我看到asyncio.ensure_future(coro)的别名再次安排执行co-例程。

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

1 个答案:

答案 0 :(得分:22)

正如你所注意到的,他们都做同样的事情。

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

create_task的存在理由[2]

  

第三方事件循环可以使用自己的Task子类来实现互操作性。在这种情况下,结果类型是Task的子类。

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

修改

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