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>
答案 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()
您刚刚错过了()
,因为结果是方法,而不是成员变量。