关于asyncio模块,如何获取子协程的返回值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于asyncio模块,如何获取子协程的返回值?相关的知识,希望对你有一定的参考价值。
协程的当前事件循环已打开。在协程对象内部,创建一个新的协程对象,并将其注册到事件循环中。
问题:如何获取sub-coroutine
的返回值?
我想获取func_first
的返回值
import asyncio
import time
async def func_first(values):
await asyncio.sleep(2)
print('out: func_first')
return values
async def func_second():
s = asyncio.create_task(func_first(100))
await asyncio.sleep(3)
print('out: func_second')
if __name__ == '__main__':
loop = asyncio.get_event_loop()
s = time.time()
loop.run_until_complete(func_second())
print('TIME:', time.time()-s)
答案
在您的代码中,只需在打印语句中添加await。实际上,它甚至比这更容易:不要为创建任务而烦恼;只需等待函数并直接打印值即可。此代码显示了两种方法:
import asyncio
import time
async def func_first(values):
await asyncio.sleep(2)
print('out: func_first')
return values
async def func_second():
s = asyncio.create_task(func_first(100))
await asyncio.sleep(3)
print('out: func_second', await s)
async def func_third():
print('out: func_third', await func_first(101))
if __name__ == '__main__':
loop = asyncio.get_event_loop()
s = time.time()
loop.run_until_complete(func_second())
print('TIME:', time.time()-s)
loop.run_until_complete(func_third())
print('TIME:', time.time()-s)
结果:
out: func_first
out: func_second 100
TIME: 3.062396764755249
out: func_first
out: func_third 101
TIME: 5.09357476234436
>>>
另一答案
我在这里找到了答案:enter link description here
asyncio.Queue
可以获取数据,看来我对该模块还是不太了解。哈哈
以上是关于关于asyncio模块,如何获取子协程的返回值?的主要内容,如果未能解决你的问题,请参考以下文章
python asyncio 获取协程返回值和使用callback
Kotlin 协程协程取消 ① ( 协程作用域取消 | 协程作用域子协程取消 | 通过抛出异常取消协程 | Job#cancel 函数 | 自定义异常取消协程 )
Kotlin 协程协程取消 ① ( 协程作用域取消 | 协程作用域子协程取消 | 通过抛出异常取消协程 | Job#cancel 函数 | 自定义异常取消协程 )