Ответ 1
Обратите внимание, что во многих случаях (и практически во всех случаях, когда ваша "дорогая операция" является вычислением, реализованным в Python), несколько потоков не будут работать одновременно из-за глобальной блокировки интерпретатора Python (GIL).
GIL - это замок уровня интерпретатора. Эта блокировка предотвращает выполнение нескольких потоков одновременно в интерпретаторе Python. Каждый поток, который хочет работать, должен ожидать освобождения GIL другим потоком, что означает, что ваше многопоточное приложение Python по сути однопоточное, верно? Да. Не совсем. Вроде, как бы, что-то вроде.
CPython использует так называемые потоки "операционной системы", то есть каждый раз, когда делается запрос на создание нового потока, интерпретатор фактически вызывает библиотеки операционных систем и ядро для создания нового потока. Например, это то же самое, что и Java. Таким образом, в памяти у вас действительно есть несколько потоков, и обычно операционная система контролирует, какой поток планируется запустить. На многопроцессорной машине это означает, что вы можете иметь много потоков, распределенных по нескольким процессорам, и все с радостью уйдут с работы.
Однако, хотя CPython действительно использует потоки операционной системы (теоретически, позволяя нескольким потокам выполняться внутри интерпретатора одновременно), интерпретатор также заставляет GIL быть полученным потоком, прежде чем он сможет получить доступ к интерпретатору и стеку и может изменять объекты Python в памяти. все волей-неволей. Последний момент заключается в том, почему существует GIL: GIL предотвращает одновременный доступ к объектам Python несколькими потоками. Но это не спасает вас (как показано в примере с Банком) от существа, чувствительного к блокировке; Вы не получите бесплатную поездку. GIL защищает память переводчиков, а не ваше здравомыслие.
См. Раздел "Глобальная блокировка интерпретатора" публикации Джесси Ноллера для получения более подробной информации.
Чтобы обойти эту проблему, загляните в многопроцессорный модуль Python.
множественные процессы (при разумном использовании IPC) являются [...] гораздо лучшим подходом к написанию приложений для многопроцессорных систем, чем потоки.