在不使用 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
而无法使用。我希望 print
在 f()
返回后被称为“回调函数”,而 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))
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
而无法使用。我希望 print
在 f()
返回后被称为“回调函数”,而 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))