asyncio:Task, create_task, ensure_future 都可以创建任务,该用哪个

注:从别人博客借鉴过来的,纯属自学用

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: 可能很多时候也可以工作,但真的没有使用的理由!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。