栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

asyncio.ensure_future与BaseEventLoop.create_task与简单协程?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

asyncio.ensure_future与BaseEventLoop.create_task与简单协程?

实际信息:

从Python 3.7开始,为此添加了

asyncio.create_task(coro)
高级功能。

您应该使用它代替其他从coroutime创建任务的方法。但是,如果您需要从任意等待中创建任务,则应使用

asyncio.ensure_future(obj)


旧信息:

ensure_future
create_task

ensure_future
是一种
Task
从创建的方法
coroutine
。它基于参数(包括
create_task
对协程和类似未来的对象使用of)以不同的方式创建任务。

create_task
是的抽象方法
AbstractEventLoop
。不同的事件循环可以以不同的方式实现此功能。

您应该

ensure_future
用来创建任务。
create_task
仅在要实现自己的事件循环类型时才需要。

更新:

@
bj0指向Guido对此主题的回答:

的要点

ensure_future()
是,如果您有可能是协程或a的东西
Future
(后者包含a,
Task
因为这是的子类
Future
),并且您希望能够在其上调用仅在其上定义的方法
Future
(可能是唯一的)有用的示例
cancel()
)。当它已经是
Future
(或
Task
)时,则不执行任何操作;当它是一个协程时,它将它
包裹 在一个
Task

如果您知道有一个协程,并且希望对其进行调度,则使用的正确API是

create_task()
。唯一应该调用的时间
ensure_future()
是在提供接受协程或a的API(如asyncio自己的大多数API)时,
Future
您需要对其进行一些操作,要求您拥有a
Future

然后:

最后,我仍然相信这

ensure_future()
是一个很少需要的功能的适当模糊的名称。从协程创建任务时,应使用适当命名的
loop.create_task()
。也许应该为此起别名
asyncio.create_task()

我很惊讶
我一直使用的主要动机

ensure_future
是,与loop的成员相比,它是更高级别的函数
create_task
(讨论中包含了诸如add
asyncio.spawn
或的想法
asyncio.create_task
)。

我还可以指出,在我看来,使用可以处理任何

Awaitable
而非协程的通用函数非常方便。

但是,Guido的答案很明确: “从协程创建任务时,应使用名称正确的

loop.create_task()

什么时候应该将协程包裹在任务中?

将协程包装在任务中-是一种在后台启动协程的方法。例子如下:

import asyncioasync def msg(text):    await asyncio.sleep(0.1)    print(text)async def long_operation():    print('long_operation started')    await asyncio.sleep(3)    print('long_operation finished')async def main():    await msg('first')    # Now you want to start long_operation, but you don't want to wait it finised:    # long_operation should be started, but second msg should be printed immediately.    # Create task to do so:    task = asyncio.ensure_future(long_operation())    await msg('second')    # Now, when you want, you can await task finised:    await taskif __name__ == "__main__":    loop = asyncio.get_event_loop()    loop.run_until_complete(main())

输出:

firstlong_operation startedsecondlong_operation finished

您可以替换

asyncio.ensure_future(long_operation())
为只是
awaitlong_operation()
感觉有所不同。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/641102.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号