Что на самом деле блокирует GIL и когда потоки всё же помогают?
Global Interpreter Lock разрешает выполнять байткод Python только одному потоку одновременно, поэтому чистый Python-код никогда не идёт параллельно по ядрам. Потоки помогают там, где работа — это ожидание, а не вычисление: сеть, диск, база. Во время блокирующего ввода-вывода блокировка отпускается. Для счётной нагрузки нужны процессы, C-расширение, отпускающее GIL, или вынос горячей части из Python.