关于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模块,如何获取子协程的返回值?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取协程的返回值

协程与异步IO

asyncio 异步编程

python asyncio 获取协程返回值和使用callback

Kotlin 协程协程取消 ① ( 协程作用域取消 | 协程作用域子协程取消 | 通过抛出异常取消协程 | Job#cancel 函数 | 自定义异常取消协程 )

Kotlin 协程协程取消 ① ( 协程作用域取消 | 协程作用域子协程取消 | 通过抛出异常取消协程 | Job#cancel 函数 | 自定义异常取消协程 )