Почему существуют треды на уровне операционной системы
Что проверяют
Понимаете ли вы, зачем операционной системе единица планирования мельче процесса, и связываете ли это с тем, что в Python потоки ускоряют не всё. Вопрос почти всегда ведёт к GIL, и продолжения ждут именно такого.
Как отвечать
Процесс это адресное пространство и набор ресурсов: страницы памяти, дескрипторы, права. Планирует же ядро не процесс, а поток: у потока свой стек, регистры и счётчик команд, а память и дескрипторы общие с соседями по процессу. Отсюда три причины существования потоков.
Первая: переключение между процессами дороже, потому что меняется адресное пространство, а вместе с ним обесцениваются кэши трансляции адресов. Потоки одного процесса переключаются дешевле и обмениваются данными без копирования.
Вторая: когда поток заблокирован на системном вызове, ядро отдаёт процессорное время другому потоку того же процесса. Без потоков ядра пришлось бы либо плодить процессы, либо писать всё на неблокирующем вводе и выводе.
Третья: только потоки, известные ядру, реально исполняются на разных ядрах процессора. Потоки, которые планирует рантайм в пространстве пользователя, живут на одном ядре, и блокирующий вызов в одном останавливает все.
Дальше про Python: threading создаёт настоящие потоки ОС, но GIL разрешает исполнять байт-код только одному одновременно. Значит, потоки выигрывают на ожидании и на вызовах в библиотеки, которые GIL отпускают, и не выигрывают на счёте чистым Python: для этого процессы. Для тысяч соединений дешевле цикл событий asyncio.
Где спотыкаются
Говорят, что из-за GIL потоки в Python ненастоящие. Потоки самые обычные, системные, планирует их ядро; ограничен только одновременный доступ к интерпретатору.
Второе: путают конкурентность и параллелизм, обещая ускорить счётный цикл пулом потоков. Получится медленнее: добавятся переключения и борьба за блокировку интерпретатора.
Третье: считают поток бесплатным и заводят его на каждое соединение. У потока есть стек и стоимость переключения контекста, и на больших числах соединений выигрывает событийный цикл или пул фиксированного размера.