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>
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 是一个方法,而不是一个成员变量。