Почему threading.local() не подходит для передачи идентификатора запроса в асинхронном приложении на FastAPI? Какую проблему решает модуль contextvars?

threading.local() хранит состояние по потоку, а несколько async-запросов работают в одном потоке и могут перезаписать request_id друг друга. ContextVar разделяет значения по контексту задачи.

Короткий ответ

Что ответить на собеседовании

threading.local() хранит состояние по потоку, а несколько async-запросов работают в одном потоке и могут перезаписать request_id друг друга. ContextVar разделяет значения по контексту задачи.

Подробный разбор

Ответ с пояснениями

threading.local() хранит состояние по потоку, а несколько async-запросов работают в одном потоке и могут перезаписать request_id друг друга. ContextVar разделяет значения по контексту задачи.

Установите значение в начале запроса и восстановите прежнее через token/reset в finally. Новая task обычно получает копию текущего контекста, но это не глобальный словарь обмена между tasks. Переходы в сторонние executors и процессы требуют проверки передачи контекста. Не используйте request_id как основание авторизации.

Источник: peps.python.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее