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

Posted

技术标签:

【中文标题】使用 call_soon() 和 ensure_future() 的区别【英文标题】:Difference between using call_soon() and ensure_future() 【发布时间】:2017-11-07 09:58:49 【问题描述】:

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

我可以使用非协同程序的非异步函数来做

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

【问题讨论】:

您实际上并没有执行 whily_naughty() 未来。你只是把它包起来了。 我已经删除了“附加”。请一次只回答一个具体问题,否则您的问题太宽泛了。 【参考方案1】:

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

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

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

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

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


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

【讨论】:

以上是关于使用 call_soon() 和 ensure_future() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

12.3call_sooncall_atcall_latercall_soon_threadsafe

使用java加密和解密密码使用啥API和算法

如何使用 php 和 mysql 使用纬度和经度进行几何搜索

Cocoa - 为啥使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber?

HTTPS和SSH方式的区别和使用

学习和使用SVN和GitHub——开篇