如何使异步任务/协程返回值被分配

时间:2019-04-21 01:56:05

标签: python asynchronous

TL; DR: 我想创建asyncio任务/协程,并获取要在var中分配的返回值。

-

我发现了这个问题Getting values from functions that run as asyncio tasks 哪个似乎讨论了类似的问题,但是sintax在asyncio模块中发生了很多变化,我什至不知道它是否相关。 [我使用的是Python 3.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()是来自文档https://docs.python.org/3/library/asyncio-task.html#coroutines

的示例协程

s()应该是一个开关,它将为场景选择适当的功能(op1,op2,op3中的一个),运行该功能并返回结果(根据我的预期),并将其分配给任务1 /任务2。

实际分配给task1 / task2的是:

<Task finished coro=<s() done, defined at C:\...\test.py:17> result=2> 
<Task finished coro=<s() done, defined at C:\...\test.py:17> result=27>

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

我需要:直接将返回值分配给变量,这是一种访问“结果”并将其分配给可以进一步操作的变量的方法。

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

1 个答案:

答案 0 :(得分:1)

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')}")

是执行此操作的一种方法。我更喜欢这样做,因为它使等待的任务更像是正常的函数调用,但是等效的是

await task1
# some time later
result_of_task1 = task1.result()

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