Python asyncio:函数还是协程,使用哪个?

Python asyncio: function or coroutine, which to use?

我想知道 foobar 之间的性能是否有明显差异:

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)是一个阻塞调用:执行线程被阻塞直到fcoroutinefuture变为完成。

async def 是通过并发 coroutines 编写异步代码的正确方法,它们可以相互通信。

async def 需要 运行 事件循环(应调用 loop.run_until_complete()loop.run_forever())。