如何使asyncio task/coroutine返回要分配的值

2024-05-17 00:50:39 发布

您现在位置:Python中文网/ 问答频道 /正文

TL;DR: 我想创建asyncio task/coroutine,并获取要在var中分配的返回值

-

我发现了这个问题Getting values from functions that run as asyncio tasks 这似乎是在谈论一个类似的问题,但sintax在asyncio模块中发生了很大的变化,我甚至不确定它是否相关。[我在使用python3.7.2]

为我解释我要做什么的示例代码:

async def s(f):
    func = {
        1: op1,
        2: op2,
        3: op3
      }.get(f,False)
    var = func(f)
    return var

def op1(f):
    print('Op1',f+f)
    return f+f

def op2(f):
    print('Op2', f*f)
    return f*f

def op3(f):
    print('Op3', f**f)
    return f**f

async def main():
    task1 = asyncio.create_task(s(1))
    task2 = asyncio.create_task(s(3))
    print(f"started at {time.strftime('%X')}")
    await task1
    await task2
    print(task1,task2)
    print(f"finished at {time.strftime('%X')}")

main()是docshttps://docs.python.org/3/library/asyncio-task.html#coroutines中的一个协同程序示例

s()应该是一个开关,它将为场景选择适当的函数(op1、op2、op3中的一个),运行函数并返回分配给task1/task2的结果(我预期的结果)。在

实际分配给task1/task2的是:

^{pr2}$

如您所见,返回存储在'result'(属性?变量?)但没有直接分配给var

我需要一种方法:将返回值直接赋给var或者一种访问“result”的方法,并将其分配给一个可以进一步操作的var。在

顺便说一句:print(task1.result)返回: <built-in method result of _asyncio.Task object at 0x0000028592DDA048>


Tags: asyncio示例taskreturnvardefresultat
1条回答
网友
1楼 · 发布于 2024-05-17 00:50:39
async def main():
    task1 = asyncio.create_task(s(1))
    task2 = asyncio.create_task(s(3))
    print(f"started at {time.strftime('%X')}")
    result_of_task1 = await task1
    result_of_task2 = await task2
    print(result_of_task1,result_of_task2)
    print(f"finished at {time.strftime('%X')}")

是一种方法。我更喜欢这样,因为它使等待任务更像普通的函数调用,但也相当于

^{pr2}$

您刚刚错过了(),因为结果是一个方法,而不是成员变量。在

相关问题 更多 >