我是这个框架的新手,并试图了解使用其中一个的差异/好处
我可以使用非同步函数来完成
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()
更有利的情况。
答案 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告诉你回调时间过长时,你可以调试这些。