Давайте сначала понять, что питон GIL обеспечивает:
Любая операция/инструкция выполняется в интерпретаторе. GIL гарантирует, что интерпретатор удерживается одним потоком на конкретным моментом времени. И ваша программа python с несколькими потоками работает в одном интерпретаторе. В любой конкретный момент времени этот интерпретатор удерживается одним потоком. Это означает, что только резьба, удерживающая переводчик, составляет , работающий, по адресу , любой момент времени.
Теперь почему это вопрос:
Ваша машина может быть, имеющих несколько ядер/процессоров. И несколько ядер позволяют нескольким потокам выполнять одновременно i.e несколько потоков могут выполнять в любой конкретный момент времени.. Но поскольку интерпретатор поддерживается одним потоком, другие потоки ничего не делают, хотя у них есть доступ к ядру. Таким образом, вы не получаете никаких преимуществ, предоставляемых несколькими ядрами, потому что в любой момент используется только одно ядро, которое является ядром, используемым потоком, в настоящее время использующим интерпретатор. Таким образом, ваша программа будет работать так долго, как если бы это была одна потоковая программа.
Однако потенциально блокирующие или длительные операции, такие как обработка ввода-вывода, обработка изображений и хруст числа NumPy, происходят за пределами GIL. Взято с here. Таким образом, для таких операций многопоточная операция будет работать быстрее, чем однопоточная операция, несмотря на наличие GIL. Таким образом, GIL не всегда является узким местом.
Редактировать: GIL представляет собой деталь реализации CPython. PyPy и Jython не имеют GIL, поэтому в них должна быть действительно многопоточной программа, я думал, что никогда не использовал PyPy и Jython и не уверен в этом.
Возможный дубликат [Почему глобальный переводчик?] (Http://stackoverflow.com/questions/265687/why-the-global-interpreter -lock) –