从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您需要对其进行一些 *** 作,要求您拥有aFuture。
然后:
最后,我仍然相信这
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()感觉有所不同。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)