使用 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
如何使用 php 和 mysql 使用纬度和经度进行几何搜索
Cocoa - 为啥使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber?