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

Difference between using call_soon() and ensure_future()

我是这个框架的新手,正在尝试了解 difference/benefits 使用其中一个框架的好处

我可以使用不是协程的非异步函数来做

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()更有优势的情况。

非协程版本永远不会协同行动。您不能 await 该函数中的任何其他内容,并且由于您调用它的方式,您不能 return 向调用者提供结果。

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

回调也不会 return 任何东西;它们是一劳永逸的例程,相信不会因 运行 任何繁重或阻塞的事情而锁定整个系统。 call_soon() returns 一个 Handle() instance 只允许您再次 取消 它(如果它已经被执行,则为空操作)。下次事件循环检查回调队列时执行回调,此时它们(希望短暂地)阻止任何其他工作完成*.

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

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


* 当你 run in debug mode 时,你会被告知回调时间太长,所以你可以调试这些。