首页 > 解决方案 > 关于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)

标签: pythonpython-asyncio

解决方案


在您的代码中,只需将 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
>>> 

推荐阅读