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

lay*_*cat 2 python concurrency asynchronous python-3.x python-asyncio

我是这个框架的新手,正在尝试了解使用一个框架的区别/好处

我可以使用一个非协程的非异步函数

def while_naughty():
    print("naughty")

loop.call_soon(self.while_naughty)
Run Code Online (Sandbox Code Playgroud)

或者

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

task = asyncio.ensure_future(naughty())
Run Code Online (Sandbox Code Playgroud)

我知道ensure_future以一个协程作为参数,希望了解一下使用call_soon()over更有利的情况ensure_future()

Mar*_*ers 6

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

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

回调也不会返回任何东西;它们是即发即弃的例程,相信不会通过运行任何繁重或阻塞的事情来锁定整个系统。call_soon()返回一个仅允许您再次取消它的Handle()实例(如果它已经被执行,则为空操作)。下次事件循环检查回调队列时会执行回调,此时它们(希望是短暂的)阻止任何其他工作的完成*

注意asyncio.ensure_future()只是创建了一个Future()实例,任务并没有真正开始!但是,如果您确实启动了它(例如,使用loop.run_until_complete()),您将获得更多控制权。您现在拥有适当的协程,它可以等待其他协程。等待其他协程让事件循环切换到准备继续的其他协程,确保您的 CPU 在有工作要做时忙于做实际工作。您的协程也可以将实际结果返回给调用者。

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


*当您在调试模式下运行时,您会被告知回调花费的时间太长,因此您可以调试这些。