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

ZeC*_*oca 4 python asynchronous

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

——

我发现这个问题从作为 asyncio 任务运行的函数中获取值似乎在谈论一个类似的问题,但是 asyncio 模块中的 sintax 已经改变了很多,我什至不确定它是否相关。[我在 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')}")
Run Code Online (Sandbox Code Playgroud)

main() 是来自文档https://docs.python.org/3/library/asyncio-task.html#coroutines的示例协程

s() 应该是一个开关,它将为场景选择正确的函数(op1、op2、op3 之一),运行该函数并返回结果,(根据我的预期)分配给 task1/task2 .

实际分配给 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tom*_*now 6

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')}")
Run Code Online (Sandbox Code Playgroud)

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

await task1
# some time later
result_of_task1 = task1.result()
Run Code Online (Sandbox Code Playgroud)

你只是错过了(),因为 result 是一个方法,而不是一个成员变量。