Python asyncio:函数还是协程,使用哪个?
Python asyncio: function or coroutine, which to use?
我想知道 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
的使用会导致与 运行 我的程序有任何实际的、明显的不同吗?
(我问的原因是我正在构建一个接口 class,它将容纳可分解的 "back-ends" 其中一些可能是异步的。我希望为 public 接口的(可重用)方法 class 因此可以为所有代码维护一个 API 而不会弄乱事件循环可用的异步后端的使用。)
更新:我没有正确检查代码,第一个版本完全无效,因此重写。
我不这么认为。我都用过,并没有真正看到区别。我更喜欢 foo 只是因为我使用它更多并且更好地理解它,但这取决于你。
天壤之别。 SyntaxError
在普通函数def
函数中使用await
import asyncio
async def atest():
print("hello")
def test():
await atest()
async def main():
await atest()
test()
--
File "test.py", line 9
await atest()
^
SyntaxError: invalid syntax
loop.run_until_complete()
应该在协程的 外部 最顶层使用。禁止使用 active (运行) 事件循环调用 run_until_complete()
。
另外loop.run_until_complete(f)
是一个阻塞调用:执行线程被阻塞直到f
coroutine或future变为完成。
async def
是通过并发 coroutines 编写异步代码的正确方法,它们可以相互通信。
async def
需要 运行 事件循环(应调用 loop.run_until_complete()
或 loop.run_forever()
)。
我想知道 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
的使用会导致与 运行 我的程序有任何实际的、明显的不同吗?
(我问的原因是我正在构建一个接口 class,它将容纳可分解的 "back-ends" 其中一些可能是异步的。我希望为 public 接口的(可重用)方法 class 因此可以为所有代码维护一个 API 而不会弄乱事件循环可用的异步后端的使用。)
更新:我没有正确检查代码,第一个版本完全无效,因此重写。
我不这么认为。我都用过,并没有真正看到区别。我更喜欢 foo 只是因为我使用它更多并且更好地理解它,但这取决于你。
天壤之别。 SyntaxError
在普通函数def
函数中使用await
import asyncio
async def atest():
print("hello")
def test():
await atest()
async def main():
await atest()
test()
--
File "test.py", line 9
await atest()
^
SyntaxError: invalid syntax
loop.run_until_complete()
应该在协程的 外部 最顶层使用。禁止使用 active (运行) 事件循环调用 run_until_complete()
。
另外loop.run_until_complete(f)
是一个阻塞调用:执行线程被阻塞直到f
coroutine或future变为完成。
async def
是通过并发 coroutines 编写异步代码的正确方法,它们可以相互通信。
async def
需要 运行 事件循环(应调用 loop.run_until_complete()
或 loop.run_forever()
)。