import asyncio
from contextvars import ContextVar
active_steps = ContextVar[list[int]]("active_steps", default=[])
async def add_steps(task_name, steps):
for step in steps:
# get the active steps
current_steps = active_steps.get()
# add a new step
current_steps.append(step) # mutates the shared list
# set the variable with the new steps
active_steps.set(current_steps)
await asyncio.sleep(0.1) # simulate async work
print(f"{task_name} final result: {active_steps.get()}")
# reset the variable with an empty array
active_steps.set([])
async def main() -> None:
requests = [add_steps("Task 1", [1, 2, 3]), add_steps("Task 2", [4, 5, 6])]
await asyncio.gather(*requests)
# Expected output:
# Task 1 final result: [1, 2, 3]
# Task 2 final result: [4, 5, 6]
if __name__ == "__main__":
asyncio.run(main())
aW1wb3J0IGFzeW5jaW8KZnJvbSBjb250ZXh0dmFycyBpbXBvcnQgQ29udGV4dFZhcgoKYWN0aXZlX3N0ZXBzID0gQ29udGV4dFZhcltsaXN0W2ludF1dKCJhY3RpdmVfc3RlcHMiLCBkZWZhdWx0PVtdKQoKCmFzeW5jIGRlZiBhZGRfc3RlcHModGFza19uYW1lLCBzdGVwcyk6CiAgICBmb3Igc3RlcCBpbiBzdGVwczoKICAgICAgICAjIGdldCB0aGUgYWN0aXZlIHN0ZXBzCiAgICAgICAgY3VycmVudF9zdGVwcyA9IGFjdGl2ZV9zdGVwcy5nZXQoKQoKICAgICAgICAjIGFkZCBhIG5ldyBzdGVwCiAgICAgICAgY3VycmVudF9zdGVwcy5hcHBlbmQoc3RlcCkgICMgbXV0YXRlcyB0aGUgc2hhcmVkIGxpc3QKCiAgICAgICAgIyBzZXQgdGhlIHZhcmlhYmxlIHdpdGggdGhlIG5ldyBzdGVwcwogICAgICAgIGFjdGl2ZV9zdGVwcy5zZXQoY3VycmVudF9zdGVwcykKCiAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjEpICAjIHNpbXVsYXRlIGFzeW5jIHdvcmsKCiAgICBwcmludChmInt0YXNrX25hbWV9IGZpbmFsIHJlc3VsdDoge2FjdGl2ZV9zdGVwcy5nZXQoKX0iKQogICAgIyByZXNldCB0aGUgdmFyaWFibGUgd2l0aCBhbiBlbXB0eSBhcnJheQogICAgYWN0aXZlX3N0ZXBzLnNldChbXSkKCgphc3luYyBkZWYgbWFpbigpIC0+IE5vbmU6CiAgICByZXF1ZXN0cyA9IFthZGRfc3RlcHMoIlRhc2sgMSIsIFsxLCAyLCAzXSksIGFkZF9zdGVwcygiVGFzayAyIiwgWzQsIDUsIDZdKV0KICAgIGF3YWl0IGFzeW5jaW8uZ2F0aGVyKCpyZXF1ZXN0cykKCiAgICAjIEV4cGVjdGVkIG91dHB1dDoKICAgICMgVGFzayAxIGZpbmFsIHJlc3VsdDogWzEsIDIsIDNdCiAgICAjIFRhc2sgMiBmaW5hbCByZXN1bHQ6IFs0LCA1LCA2XQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGFzeW5jaW8ucnVuKG1haW4oKSkK
Task 1 final result: [1, 4, 2, 5, 3, 6]
Task 2 final result: [1, 4, 2, 5, 3, 6]