【发布时间】: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) 返回:
<built-in method result of _asyncio.Task object at 0x0000028592DDA048>
【问题讨论】:
-
听起来你需要写:
print(task1.result()).
标签: python asynchronous