Потоки, создаваемые при помощи
threading (и его низкоуровневой базы
thread) являются настоящими полноценными потоками ОС (как в C/C++ и большинстве языков). Но в каждом процессе интерпретатора существует одна глобальная блокировка GIL, разделяемая между всеми потоками. Большинство инструкций Python (доступ ко всем объектам, глобальным переменным и вызов функций и методов) требуют захвата GIL. Так как единственный GIL в каждый конкретный момент может быть захвачен только одним потоком, следовательно только один, захвативший GIL, поток может исполняться в один момент времени. Следовательно о распараллеливании вычислений на чистом Python (без ухищрений) можно забыть. Это убивает большую часть преимуществ многопоточности, но не все. Например, многие функции дискового и сетевого ввода/вывода освобождают GIL во время ожидания окончания операции (доступ к Python-объектам внутри интерпретатора в этот момент не требуется), что позволяет другим потокам захватывать GIL. Следовательно, GIL не мешает распараллеливанию ввода/вывода.