在不使用 await 的情况下将 return 值从协程传递到回调函数

Pass return value from coroutine to callback function without using await

import asyncio

async def f():
    # something, for example await asyncio.sleep(4)
    return "return value from f"

async def main():
    # schedule f, print result, but don't await
    for i in range(10):
        await asyncio.sleep(1)  # just an example for some other task
        print(i)

asyncio.run(main())

我可以使用 print(await f()),但由于 await 而无法使用。我希望 printf() 返回后被称为“回调函数”,而 main() 的其余部分已经继续。因此,假设 f 中的 # something 花费了 4 秒,预期输出将如下所示:

0
1
2
3
return value from f
4
5
6
7
8
9

这对你有用吗?我稍微更改了 f() 协程,但这似乎确实有效。此外,您需要等待 asyncio.sleep()。如果您有任何问题,请告诉我您的想法。

这是我引用的答案:

import asyncio

async def f():
    await asyncio.sleep(3)
    print("return value from f")

async def main():
    loop = asyncio.get_event_loop()
    loop.create_task(f())
    for i in range(10):
        await asyncio.sleep(1)  # just an example for some other task
        print(i)

asyncio.run(main())

您可以定义一个以 f 和回调函数作为参数的函数。

async def call(f, cb):
    cb(await f())

并且您可以在不使用 await 的情况下为其安排任务:

asyncio.create_task(call(f, print))