Что такое thread locals?

Thread locals в Python — это механизм хранения данных, привязанных к конкретному потоку: объект threading.local даёт «общий» интерфейс, но каждое поле внутри него имеет отдельное значение для каждого потока.
Подробный ответ

В многопоточном коде часто нужны данные «глобальные» для потока, но невидимые другим потокам: текущий пользователь, id запроса, коннект к БД, контекст логирования. Thread‑locals решают эту задачу.

Базовая идея

Объект threading.local() создаётся один раз, но его атрибуты фактически хранятся отдельно для каждого потока. Запись в storage.user в одном потоке не влияет на значение storage.user в другом.

import threading

storage = threading.local()

def worker(name):
   storage.user = name
   print(threading.current_thread().name, storage.user)

threads = [threading.Thread(target=worker, args=(f"user-{i}",)) for i in range(3)]
for t in threads:
   t.start()
for t in threads:
   t.join()

Каждый поток увидит своё значение storage.user, даже несмотря на общий объект storage на уровне модуля.

Где это применяют

  • Web‑фреймворки: хранение контекста текущего запроса (request id, user id, locale) без явной передачи по всей цепочке вызовов.

  • Логирование: добавление в логи информации о запросе/пользователе из thread‑local контекста.

  • Подключения к БД, кешам и т.п.: один коннект на поток (в старых WSGI‑подходах).

Ограничения и нюансы

  • Thread‑locals работают на уровне threading; в asyncio‑коде они не подходят для различения задач внутри одного потока — там используют contextvars.

  • Чрезмерное использование thread‑locals делает зависимости неявными: функция опирается на «глобальное» состояние вместо явных аргументов, что усложняет тестирование.

  • Важно очищать/пересоздавать thread‑local‑контекст в пулах потоков, чтобы данные предыдущего запроса не «утекали» в следующий.

Формулировка для ответа

Thread‑locals — это локальное хранилище на поток: один объект threading.local, у которого каждый поток видит собственный набор атрибутов. Это удобно для хранения контекста запроса, текущего пользователя и других данных, которые должны быть «глобальными» в рамках потока, но изолированными между потоками. В асинхронном мире аналогичную задачу решают contextvars.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге