我正在尝试在 Python 中使用一个简单的异步示例,主要遵循这里的出色答案。
我的目标是设置一个上下文变量,并通过不断附加来跟踪一系列调用。我知道可以使用该方法访问上下文变量,并且可以使用该.get()
方法更改它们的值.set()
。sum()
然而,在以下情况下,尽管从控制台可以明显看出对函数的一系列调用,但变量不会被修改。
编辑:
根据下面 Michael Butscher 的评论,我用 list: 替换了原始的上下文变量(它是一个字符串),output_list
并使用.append()
. 现在,这确实使我能够查看最终输出,但不能查看各个sum()
方法中的中间输出。
完整代码:
import asyncio
import contextvars
import time
output_list = contextvars.ContextVar('output_list', default=list())
async def sleep():
print(f'Time: {time.time() - start:.2f}')
await asyncio.sleep(1)
async def sum(name, numbers):
total = 0
for number in numbers:
print(f'Task {name}: Computing {total}+{number}')
await sleep()
total += number
output_list.set(output_list.get().append(f"{name}"))
print(f'Task {name}: Sum = {total}\n')
print(f'Partial output from task {name}:', output_list.get())
start = time.time()
loop = asyncio.get_event_loop()
tasks = [
loop.create_task(sum("A", [1, 2])),
loop.create_task(sum("B", [1, 2, 3])),
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
end = time.time()
print(f'Time: {end-start:.2f} sec')
print("Final output_str =", output_list.get())
如何迭代地跟随上下文变量列表的扩展output_list
?
我想要的控制台输出是:
Task A: Computing 0+1
Time: 0.00
Task B: Computing 0+1
Time: 0.00
Task A: Computing 1+2
Time: 1.02
Task B: Computing 1+2
Time: 1.02
Task A: Sum = 3
Partial output from task A: ['A']
Task B: Computing 3+3
Time: 2.02
Task B: Sum = 6
Partial output from task B: ['A', 'B']
Time: 3.03 sec
Final output_str = ['A', 'B']
相反,我得到:
Task A: Computing 0+1
Time: 0.00
Task B: Computing 0+1
Time: 0.00
Task A: Computing 1+2
Time: 1.02
Task B: Computing 1+2
Time: 1.02
Task A: Sum = 3
Partial output from task A: None
Task B: Computing 3+3
Time: 2.02
Task B: Sum = 6
Partial output from task B: None
Time: 3.03 sec
Final output_str = ['A', 'B']