Thread locals в Python — это механизм хранения данных, привязанных к конкретному потоку: объект threading.local даёт «общий» интерфейс, но каждое поле внутри него имеет отдельное значение для каждого потока.
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.
Оцени свой прогресс