使用call_soon()和ensure_future()之间的区别

时间:2017-11-07 09:58:49

标签: python python-3.x asynchronous concurrency python-asyncio

我是这个框架的新手,并试图了解使用其中一个的差异/好处

我可以使用非同步函数来完成

def while_naughty():
    print("naughty")

loop.call_soon(self.while_naughty)

async def naughty():
    print("naughty")

task = asyncio.ensure_future(naughty())

我知道ensure_future需要一个协同例程作为参数,我希望了解使用call_soon()优于ensure_future()更有利的情况。

1 个答案:

答案 0 :(得分:3)

非协同版本永远不会合作。您不能await该函数中的任何其他内容,并且由于您调用它的方式,您无法将结果返回给调用者。

loop.call_soon()专门用于回调,回调通常是用于挂钩事件的非常简单的函数(完成工作,将来引发异常等),并且它们不是预期的合作。

回调也不会返回任何东西;它们是即发即弃的例程,可以通过运行任何重载或阻塞来锁定整个系统。 call_soon()会返回Handle() instance,只允许您取消它(如果已经执行了,则为no-op)。下次在事件循环检查回调队列时执行回调,此时它们(希望简要地)阻止任何其他工作完成 *

请注意asyncio.ensure_future()只创建一个Future()实例,该任务实际上并未启动!但如果你确实启动了它(比如loop.run_until_complete()),你就可以获得更多控制权。你现在有适当的协程,它可以等待其他协同程序。等待其他协同程序允许事件循环切换到准备继续的其他协同程序,确保您的CPU忙于在有工作要做的时候进行实际工作。而你的协程也可以将实际结果返回给调用者。

使用更适合您的用例的任何一种。在大型应用程序中,您可能会同时使用它们。

* 当你run in debug mode告诉你回调时间过长时,你可以调试这些。