使用call\u soon()和确保\u future()之间的区别

2024-05-19 03:05:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我是这个框架的新手,我试图理解使用其中一个框架的区别/好处

我可以使用一个非异步函数,它不是一个协同例程

def while_naughty():
    print("naughty")

loop.call_soon(self.while_naughty)

或者

^{pr2}$

我知道确保future以一个co-routine作为参数,我希望了解使用call_soon()比使用ensure_future()更有利的情况。在


Tags: 函数self框架loopdeffuturecall例程
1条回答
网友
1楼 · 发布于 2024-05-19 03:05:43

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

loop.call_soon()专门用于回调,回调通常是非常简单的函数,用于钩住事件(作业完成、将来引发异常等),它们不需要合作。在

回调也不需要返回任何内容;它们是fire-and-forget例程,被信任不会通过运行任何重的或阻塞的东西来锁定整个系统。call_soon()返回一个^{} instance,它只允许您再次取消它(如果已经执行了,则返回no-op)。回调将在下次事件循环检查回调队列时执行,此时它们(希望是短暂的)阻止任何其他工作的执行*。在

注意,asyncio.ensure_future()只创建一个Future()实例,任务实际上并没有启动!但是如果你真的启动了它(比如说,^{}),你会得到更多的控制。你现在有了正确的协同计划,它可以在其他协同计划中等待。等待其他协程可以让事件循环切换到其他准备好继续的协程,确保您的CPU在有工作要做时忙于执行实际工作。你的协同程序也可以向调用者返回实际结果。在

使用哪个更适合您的用例。在大型应用程序中,您可能会同时使用这两种方法。在


*当您run in debug mode时,您会被告知回调时间过长,因此您可以调试这些。在

相关问题 更多 >

    热门问题