替换回调辅助函数以将协程中的 return 值传递给另一个函数

Replace callback helper function to pass return value from coroutine into another function

import asyncio

async def f():
    await asyncio.sleep(2.5)
    return "return value from f after 2.5 seconds"

def g(x):
    print(x)

async def main():
    ##############################################
    async def callback_helper(original, callback):
        callback(await original())
    asyncio.create_task(callback_helper(f, g))
    ##############################################
    for i in range(1, 5):
        await asyncio.sleep(1)
        print(i, "seconds in main")

asyncio.run(main())

这正是我想要的:

1 seconds in main
2 seconds in main
return value from f after 2.5 seconds
3 seconds in main
4 seconds in main

我只能修改####################行之间的代码。我无法更改 fgmain 的其余部分。有没有更优雅的方法来做到这一点?我必须首先定义一个“回调辅助函数”,这似乎很奇怪。我如何 运行 协程并将 return 值传递给另一个函数而不阻塞?我想要做的就是在完成后使用 f 中的 return 值调用 g。我认为 asyncio 中必须有一些东西。

在包装协程中等待协程的替代方法是使用 add_done_callback,也就是 available on all futures, and therefore on tasks

asyncio.create_task(f()).add_done_callback(lambda fut: g(fut.result()))