加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2016-03-23 09:18:39)
标签:

杂谈

文档里明确指出:

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

参考:

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有