Какова глобальная блокировка интерпретатора (GIL) в CPython?

LINQ обозначает Язык Интегрированный Запрос и является способом обеспечить механизм "запросов" общей цели в CLR.

В он - наиболее базовый уровень, это состоит из ряда методов на IEnumerable< T> - например, Выбор, Сумма, Где - который может использоваться для ограничений, проекций, и т.д. [1]

Для взятия его немного далее, LINQ также определяет новую модель поставщика LINQ, которая может взять дерево выражений и использовать его для выполнения "собственных" запросов против источника данных за пределами CLR - например, LINQ к SQL, LINQ к XML, LINQ к NHibernate, и т.д.

, C# и VB.NET также определили синтаксис запроса, который позволяет Вам писать встроенные запросы со строгим контролем типов (который выглядит очень похожим на SQL), который компилятор затем переводит в эквивалентный IEnumerable< T> вызовы.

мне, самой интересной вещью о LINQ являются все функции C# и VB.NET, которые были необходимы для поддержки его, полезны самостоятельно. Дополнительные методы, анонимные типы, лямбда-выражения и неявная типизация все требовались поддерживать LINQ - но мы склонны использовать те функции за пределами чистого контекста LINQ.

[1] Это - реляционные условия, функциональные программисты, вероятно, предпочли бы Карту, Уменьшили бы, Сгиб, и т.д.

229
задан Antti Haapala 16 October 2018 в 05:16
поделиться

3 ответа

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

Обратите внимание, что Python GIL на самом деле является проблемой только для CPython, эталонной реализации. Jython и IronPython не имеют GIL. Как разработчик Python вы обычно не сталкиваетесь с GIL, если только не перепишем расширение C. Разработчикам расширений C необходимо выпустить GIL, когда их расширения блокируют ввод-вывод, чтобы другие потоки в процессе Python получили возможность работать.

210
ответ дан 23 November 2019 в 03:44
поделиться

Предположим, у вас есть несколько потоков, которые на самом деле не касаются данных друг друга. Они должны выполняться как можно более независимо. Если у вас есть «глобальная блокировка», которую вам нужно получить, чтобы (скажем) вызвать функцию, это может стать узким местом. Вы можете вообще не получить большой выгоды от наличия нескольких потоков.

Чтобы привести это к реальной аналогии: представьте, что 100 разработчиков работают в компании только с одной кофейной кружкой. Большинство разработчиков вместо кодирования тратили бы свое время в ожидании кофе.

Ничего из этого не специфично для Python - я не знаю подробностей того, для чего Python вообще понадобился GIL. Однако, надеюсь, это дало вам лучшее представление об общей концепции.

56
ответ дан 23 November 2019 в 03:44
поделиться

Когда два потока имеют доступ к одной и той же переменной, возникает проблема. В C ++, например, способ избежать проблемы состоит в том, чтобы определить некоторую блокировку мьютекса, чтобы два потока не могли, скажем, одновременно войти в установщик объекта.

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

Это означает, что если вы начнете писать какой-то многопоточный код, чтобы использовать преимущества вашего многоядерного процессора, ваша производительность не улучшится. Обычный обходной путь состоит в переходе на многопроцессорность.

Обратите внимание, что можно выпустить GIL, если вы, например, внутри метода, написанного на C.

Использование GIL не присуще Python, но некоторым его интерпретатора, включая наиболее распространенный CPython. (#edited, см. комментарий)

Проблема GIL все еще актуальна в Python 3000.

15
ответ дан 23 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: