注:从别人博客借鉴过来的,纯属自学用
http://blog.sina.com.cn/s/blog_6262a50e0102wngq.html
文档里明确指出:
Don’t directly create Task instances: use the ensure_future() function or the BaseEventLoop.create_task() method.
翻译:不要直接创建 Task 实例,应该使用 ensure_future() 函数或 BaseEventLoop.create_task() 方法。
为什么呢?看 create_task 的文档:
Third-party event loops can use their own subclass of Task for interoperability. In this case, the result type is a subclass of Task.
翻译:为了 interoperability,第三方的事件循环可以使用自己的 Task 子类。这种情况下,返回结果的类型是 Task 的子类。
那么用 ensure_future 还是 create_task 呢?先对比一下函数声明:
asyncio.ensure_future(coro_or_future, *, loop=None)
BaseEventLoop.create_task(coro)
显然,ensure_future 除了接受 coroutine 作为参数,还接受 future 作为参数。
看 ensure_future 的代码,会发现 ensure_future 内部在某些条件下会调用 create_task,综上所述:
encure_future: 最高层的函数,推荐使用!
create_task: 在确定参数是 coroutine 的情况下可以使用。
Task: 可能很多时候也可以工作,但真的没有使用的理由!