我想知道foo
和之间的性能是否存在明显差异bar
:
class Interface:
def __init__(self, loop):
self.loop = loop
def foo(self, a, b):
return self.loop.run_until_complete(self.bar(a, b))
async def bar(self, a, b):
v1 = await do_async_thing1(a)
for i in range(whatever):
do_some_syncronous_work(i)
v2 = await do_async_thing2(b, v1)
return v2
async def call_foo_bar(loop):
a = 'squid'
b = 'ink'
interface = Interface(loop)
v_foo = interface.foo(a, b)
v_bar = await interface.bar(a, b)
但是使用run_until_complete
原因会导致与运行我的程序有任何实际的,明显的不同吗?
(我问的原因是我正在构建一个接口类,以容纳可分解的“后端”,其中某些后端可能是异步的。我希望为接口类的公共(可重用)方法使用标准函数,因此可以为所有代码维护API,而不会弄乱使用可用事件循环的异步后端。)
更新:我没有正确检查代码,第一个版本完全无效,因此被重写。
loop.run_until_complete()
应该在协程之外的最顶层使用。禁止run_until_complete()
使用活动(运行)事件循环进行调用。
这loop.run_until_complete(f)
也是一个阻塞调用:阻塞执行线程,直到f
协程或将来完成为止。
async def
通过创建可能相互通信的并发协程,是一种编写异步代码的正确方法。
async def
需要运行事件循环(loop.run_until_complete()
或loop.run_forever()
应调用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句