【问题标题】:What's the difference between loop.create_task, asyncio.async/ensure_future and Task?loop.create_task、asyncio.async/ensure_future 和 Task 有什么区别?
【发布时间】:2016-03-02 23:54:06
【问题描述】:

我对一些asyncio 函数有点困惑。我看到有BaseEventLoop.create_task(coro) 函数来安排协同程序。 create_task 的文档说它是一个新功能,为了兼容性,我们应该使用 asyncio.async(coro),通过再次引用文档,我看到是 asyncio.ensure_future(coro) 的别名,它再次安排了协同例程的执行。

同时,我一直在使用Task(coro) 来安排协同程序的执行,这似乎也可以正常工作。那么,所有这些有什么区别?

【问题讨论】:

    标签: python python-3.x coroutine python-asyncio


    【解决方案1】:

    正如您所注意到的,它们都做同样的事情。

    asyncio.async 必须替换为 asyncio.ensure_future,因为在 Python >= 3.5 中,async 已成为关键字[1]

    create_task 存在的理由[2]

    第三方事件循环可以使用他们自己的 Task 子类来实现互操作性。在这种情况下,结果类型是 Task 的子类。

    这也意味着您不应该直接创建Task,因为不同的事件循环可能有不同的创建“任务”的方式。

    编辑

    另一个重要的区别是ensure_future除了接受协程外,还接受任何等待对象;另一方面,create_task 只接受协程。

    【讨论】:

    • 听起来我最好使用ensure_future。感谢您解决这个问题。
    • 除非你为 Python
    • 啊,是的。我没注意!我 am 碰巧使用 Python
    • 这是违反直觉的,因为听起来你说要使用 ensure_future 而不是 create_task,所以我进行了研究。 2016年,Guido said the opposite。如果你知道你有一个协程并且你想安排它的执行,你应该直接调用 create_task。 create_task 存在,因此第三方循环可以返回子类,因此您不应直接调用任务构造函数。希望这能为其他异步新手扫清障碍。
    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多