【问题标题】:How to make asyncio task / coroutine return values to be assigned如何使异步任务/协程返回值被分配
【发布时间】:2019-04-21 01:56:04
【问题描述】:

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

-

我发现了这个问题Getting values from functions that run as asyncio tasks 似乎在谈论类似的问题,但在 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')}")

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>

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

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

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

【问题讨论】:

  • 听起来你需要写:print(task1.result()).

标签: python asynchronous


【解决方案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()

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

【讨论】:

  • 我的印象是你不能分配 await 表达式。无论如何,两种方式都解决了我的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 2013-03-22
  • 2020-04-20
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多