Многопоточность — это еще одна концепция, которая рассматривалась в главе 1 книги Violent Python. Многопоточность — это форма параллелизма, которая означает, что выполнение кода может выполняться одновременно. Процесс также используется для описания одновременного выполнения программы, чем поток и процесс отличаются. Согласно SO процессы используются для выполнения более тяжеловесных фрагментов кода. Потоки выполняются в общем пространстве памяти, тогда как процессы выполняются в отдельном пространстве памяти.

Кроме того, Python использует глобальную блокировку интерпретатора (GIL). Это противоречивая особенность Python, которая означает, что он не может в полной мере использовать возможности многопроцессорной обработки системы, в которой он работает. В статье объясняется, что каждый поток должен иметь доступ к GIL при взаимодействии с объектами Python.

Поскольку потоки работают в одном и том же пространстве памяти, это может означать, что состояние программы может быть изменено неправильно. Например, если два потока одновременно увеличивают одну и ту же ячейку памяти, то значение может увеличиваться только на единицу вместо правильной величины, т. е. на два.

Это проблема, потому что это означает, что даже в многопоточном приложении одновременно может выполняться только один поток. Если поток выполняет некоторую операцию блокировки (т. е. операцию, ожидающую завершения отдельной операции), например файловый ввод-вывод, поток отказывается от GIL, чтобы другой поток мог его использовать. Когда операция блокировки завершена, поток пытается повторно запросить GIL, чтобы продолжить работу.

Для достижения истинного параллельного программирования лучше использовать многопроцессорный модуль напрямую, в котором каждый процесс использует свое собственное пространство памяти. Однако это ограничено количеством процессоров/ядер на вашем компьютере.