使用 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 时,你会被告知回调时间太长,所以你可以调试这些。
我是这个框架的新手,正在尝试了解 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 时,你会被告知回调时间太长,所以你可以调试这些。