【问题标题】:Difference between using call_soon() and ensure_future()使用 call_soon() 和 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() 未来。你只是把它包起来了。
  • 我已经删除了“附加”。请一次只回答一个具体问题,否则您的问题太宽泛了。

标签: python python-3.x asynchronous concurrency python-asyncio


【解决方案1】:

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

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

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

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2019-04-02
    • 2010-11-09
    • 2017-01-30
    • 2010-10-26
    相关资源
    最近更新 更多