Что такое GIL и как он влияет на многопоточность?
Global Interpreter Lock позволяет в CPython выполнять байт-код только одному потоку одновременно, поэтому потоки никогда не исполняют Python-код параллельно на разных ядрах. При этом потоки полезны для I/O-задач, потому что на время блокирующих вызовов GIL отпускается. Для CPU-задач нужен multiprocessing, C-расширение, отпускающее GIL, или другой рантайм.