gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:19:30 26 4
gpt4 key购买 nike

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() 是来自 docs 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>

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

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

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

最佳答案

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()

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

关于python - 如何使异步任务/协程返回值被分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55779254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com