Python:等待最外层的异步函数

Python:等待最外层的异步函数,python,promise,async-await,python-asyncio,coroutine,Python,Promise,Async Await,Python Asyncio,Coroutine,可以等待使用'async'关键字(Python 3.5+)创建的Python协同程序,但是不能等待最外层的一个,因为Python说“SyntaxError:'await'outside function” 如何“等待”上述示例中的“f”函数?不可能在全局范围内等待,而是按如下方式运行事件循环: import asyncio as aio async def f(): print(1) await aio.sleep(3) print(2) return 3 d

可以等待使用'async'关键字(Python 3.5+)创建的Python协同程序,但是不能等待最外层的一个,因为Python说“SyntaxError:'await'outside function”


如何“等待”上述示例中的“f”函数?

不可能在全局范围内等待,而是按如下方式运行事件循环:

import asyncio as aio

async def f():
    print(1)
    await aio.sleep(3)
    print(2)
    return 3

def fdone(r):
    print(r.result())

loop = aio.get_event_loop()
t = loop.create_task(f())
t.add_done_callback(fdone)
loop.run_until_complete(t)
print(4)

不可能在全局范围内等待,而是按如下方式运行事件循环:

import asyncio as aio

async def f():
    print(1)
    await aio.sleep(3)
    print(2)
    return 3

def fdone(r):
    print(r.result())

loop = aio.get_event_loop()
t = loop.create_task(f())
t.add_done_callback(fdone)
loop.run_until_complete(t)
print(4)

如果使用Python 3.7+,语法更简单(无需手动创建循环等):


如果使用Python 3.7+,语法更简单(无需手动创建循环等):

一个更简单的
打印(loop.run_直到完成(f())
也同样有效,而
run_直到完成()
将自动创建任务。您不需要
add_done_callback
,因为
run_until_complete()
会返回它收到的等待结果。一个更简单的
打印(loop.run_until_complete(f())
也可以工作,因为
run_until_complete()
会自动创建任务。您不需要
add_done_callback
,因为
run_until_complete()
返回它收到的等待结果。
import asyncio as aio

async def f():
    print(1)
    await aio.sleep(3)
    print(2)
    return 3

print(aio.run(f())