threading.local() хранит состояние по потоку, а несколько async-запросов работают в одном потоке и могут перезаписать request_id друг друга. ContextVar разделяет значения по контексту задачи.
Почему threading.local() не подходит для передачи идентификатора запроса в асинхронном приложении на FastAPI? Какую проблему решает модуль contextvars?
threading.local() хранит состояние по потоку, а несколько async-запросов работают в одном потоке и могут перезаписать request_id друг друга. ContextVar разделяет значения по контексту задачи.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
threading.local() хранит состояние по потоку, а несколько async-запросов работают в одном потоке и могут перезаписать request_id друг друга. ContextVar разделяет значения по контексту задачи.
Установите значение в начале запроса и восстановите прежнее через token/reset в finally. Новая task обычно получает копию текущего контекста, но это не глобальный словарь обмена между tasks. Переходы в сторонние executors и процессы требуют проверки передачи контекста. Не используйте request_id как основание авторизации.
Источник: peps.python.org.