Какое пространство памяти есть у треда
Что проверяют
Понимаете ли вы, что общее у потоков одного процесса, а что у каждого своё, и как это устроено в CPython. Интервьюеру важно, чтобы из ответа следовало, зачем нужны блокировки. Следом почти всегда спрашивают про GIL и про отличие потоков от процессов multiprocessing.
Как отвечать
Сначала уровень ОС. Все потоки процесса живут в одном адресном пространстве:
- общее: код, куча, глобальные и статические данные, открытые файлы и сокеты;
- своё у каждого потока: стек вызовов, регистры и указатель команд, локальное хранилище потока (TLS). В Linux стек потока обычно резервирует 8 МБ виртуальной памяти (значение из
ulimit -s), физические страницы выделяются по мере использования.
Теперь CPython. Все объекты Python лежат в общей куче интерпретатора, поэтому любой объект, до которого поток дотянется по ссылке, общий. У каждого потока своё состояние PyThreadState и свой стек кадров: локальные переменные существуют в кадре конкретного вызова, и другой поток их не видит. Но если локальная переменная ссылается на глобальный список, сам список общий.
Для данных, которые должны быть свои у каждого потока, есть threading.local(), в асинхронном коде вместо него используют contextvars. Размер стека новых потоков задаёт threading.stack_size() до их создания.
Отдельно скажите про GIL: он защищает внутренности интерпретатора, а не ваши данные. counter += 1 это несколько байт-кодов, между ними поток может переключиться, поэтому нужен threading.Lock. В free-threaded сборке без GIL, которая с Python 3.14 официально поддерживается как отдельный вариант, это ещё важнее.
У процессов multiprocessing адресные пространства раздельные, данные передаются через сериализацию или shared_memory.
Где спотыкаются
Говорят, что у потока своя куча. Куча общая, отдельны только стек и TLS.
Считают, что GIL делает код потокобезопасным. Он не делает атомарными ваши составные операции вроде «прочитать, изменить, записать».
Путают потоки с процессами: берут threading для тяжёлых вычислений или ждут, что изменение глобальной переменной в дочернем процессе увидит родитель.