Что такое поток (thread)
Что проверяют
Знаете ли вы про глобальную блокировку интерпретатора. Вопрос выглядит как определение из учебника, но в Python за ним всегда стоит проверка: понимает ли кандидат, что потоки здесь не дают параллельности по процессору.
Как отвечать
Поток это отдельная последовательность выполнения внутри процесса: своя область стека, общая память и общие объекты. Создаётся через threading.Thread, запускается методом start, дожидается через join.
Дальше главное. В основной реализации интерпретатора есть глобальная блокировка, и байткод в каждый момент исполняет только один поток. Поэтому вычислительная задача на десяти потоках не ускорится, а часто станет медленнее из-за переключений.
Где потоки всё равно выигрывают: ожидание. На время системного вызова блокировка отпускается, поэтому сетевые запросы, чтение файлов и обращения к базе прекрасно распараллеливаются потоками.
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=8) as pool:
results = list(pool.map(fetch, urls))Что брать вместо: процессы (multiprocessing, ProcessPoolExecutor) для вычислений, asyncio для тысяч одновременных соединений, библиотеки численных расчётов, которые отпускают блокировку внутри своего кода. В свежих сборках интерпретатора появился экспериментальный режим без глобальной блокировки, но опираться на него в продакшене рано.
Где спотыкаются
Обещают ускорение вычислений от потоков и не могут объяснить, почему замер этого не показывает. Ответ про разницу между задачами, упирающимися в процессор, и задачами, упирающимися в ожидание, обязателен.
Считают, что блокировка интерпретатора делает код потокобезопасным. Она не делает: инкремент общей переменной это чтение, сложение и запись, между ними поток снимают, и обновления теряются. Нужен Lock или очередь.
Не продумывают завершение. Демонический поток убивают на выходе посреди работы, обычный держит процесс до конца, а бесконечный цикл внутри потока корректно прерывается только через флаг вроде threading.Event.