Почему копия контекста не делает словарь отдельным
contextvars помогает хранить request ID для задач, которые выполняются на одном потоке event loop. При обычном создании asyncio.Task контекст копируется, поэтому новая задача получает текущую привязку переменной.
Но копия контекста поверхностная. Если ContextVar содержит словарь, родитель и дочерняя задача могут видеть один объект. Изменение его содержимого будет общим; set с новым значением меняет привязку в текущем контексте.
Для метаданных запроса удобнее неизменяемые значения. После set сохраняйте токен и восстанавливайте предыдущую привязку через reset в finally. Дочерняя задача может сохранить захваченный контекст и после завершения запроса, поэтому долгоживущей фоновой работе передавайте только необходимые данные.
#python #asyncio
Post #5051
482
