Что такое время выполнения в контексте Python? Из чего он состоит? - PullRequest
2 голосов
/ 18 февраля 2020

В контексте этого вопроса Что такое «время выполнения»? ()

Я пытаюсь понять, из чего будет состоять python среда выполнения. Я думаю:

  1. Процесс python, который содержит все переменные времени выполнения.
  2. GIL
  3. Базовый код интерпретатора (CPython et c.).

Теперь, если это правильно, можем ли мы сказать, что многопроцессорная обработка в python создает несколько сред выполнения, а процесс python - это то, что мы можем напрямую связать со средой выполнения? (Я думаю, что это правильный вариант)

Или каждый поток python со своим собственным стеком, который работает в том же GIL и пространстве памяти, что и родительский процесс, может быть вызван как имеющий отдельную среду выполнения?

Или, неважно, сколько потоков или процессов запущено, все они попадут под одну среду выполнения?

Проще говоря, каково определение среды выполнения в контексте Python?

PS: Я понимаю разницу между потоками и процессами. ГИЛ: Я понимаю последствия, но я не впадаю в это.

1 Ответ

3 голосов
/ 18 февраля 2020

Вы говорите о двух разных (но похожих) понятиях в информатике; многопроцессорность и многопоточность. Вот некоторая подборка вопросов / ответов, которые могут быть полезны:

Мультипроцессирование - это использование двух или более центральных процессоров (ЦП) в пределах одной компьютерной системы. Термин также относится к способности системы поддерживать более одного процессора или способности распределять задачи между ними.

В компьютерной архитектуре многопоточность - это способность центрального процессора (ЦП) (или одно ядро ​​в многоядерном процессоре) для одновременного обеспечения нескольких потоков выполнения, поддерживаемых операционной системой. Этот подход отличается от многопроцессорности. В многопоточном приложении потоки совместно используют ресурсы одного или нескольких ядер, которые включают в себя вычислительные блоки, кэши ЦП и буфер преобразования просмотра (TLB).

Процесс

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

Поток

Поток - это объект внутри процесса, который может быть планируется к исполнению. Все потоки процесса совместно используют его виртуальное адресное пространство и системные ресурсы. Кроме того, каждый поток поддерживает обработчики исключений, приоритет планирования, локальное хранилище потока, уникальный идентификатор потока и набор структур, которые система будет использовать для сохранения контекста потока до его планирования. Контекст потока включает в себя набор машинных регистров потока, стек ядра, блок среды потока и пользовательский стек в адресном пространстве процесса потока. Потоки также могут иметь собственный контекст безопасности, который можно использовать для олицетворения клиентов.


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

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

Механизм, используемый интерпретатором CPython для обеспечения выполнения только одного потока Python байт-код одновременно. Это упрощает реализацию CPython, делая объектную модель (включая критические встроенные типы, такие как dict) неявно защищенной от одновременного доступа. Блокировка всего интерпретатора облегчает многопоточность интерпретатора за счет большей части параллелизма, обеспечиваемого многопроцессорными машинами.

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

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

Полезный источник для получения дополнительной информации о GIL.

Всякий раз, когда вы выполняете ветвление, весь процесс Python дублируется в памяти (включая интерпретатор Python, ваш код и все библиотеки, текущий стек и т. Д.) 1175 *.) Для создания второго процесса - одна из причин, по которой создание процесса намного дороже, чем создание потока.

Это создает новую копию интерпретатора python.

One Преимущество наличия двух python работающих интерпретаторов состоит в том, что теперь у вас есть два GIL (глобальные блокировки интерпретатора), и, следовательно, вы можете иметь настоящую многозадачность в многоядерной системе.

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

Управление памятью в Python включает частную кучу, содержащую все Python объекты и структуры данных. Управление этой частной кучей обеспечивается администратором памяти Python. Python диспетчер памяти имеет различные компоненты, которые имеют дело с различными динамическими аспектами c управления хранением, такими как совместное использование, сегментация, предварительное распределение или кэширование.


Когда вы создаете поток через * Библиотека 1109 *, вы эффективно создаете задания в одной Python среде выполнения. Эта среда выполнения гарантирует, что потоки имеют общую память, и управляет последовательностью выполнения этих потоков с помощью global interpreter lock:

Когда вы запускаете процесс через библиотеку multiprocessing, вы порождаете новый процесс, который содержит новый интерпретатор Python (новое время выполнения), который выполняет назначенный код. Если вы хотите разделить память, вы должны использовать multiprocessing.shared_memory:

Этот модуль предоставляет класс SharedMemory для выделения и управления разделяемой памятью, доступ к которой осуществляется одним или несколькими процессами на многоядерной или симметричной многопроцессорной (SMP) машине. Чтобы помочь в управлении жизненным циклом разделяемой памяти, особенно в разных процессах, в модуле multiprocessing.managers также предусмотрен подкласс BaseManager SharedMemoryManager.


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

Да. Разный GIL, разное пространство памяти, разное время выполнения.

Каждый поток python со своим собственным стеком, который работает в том же GIL и пространстве памяти, что и родительский процесс, может называться как имеющий отдельное время выполнения?

Зависит от того, что вы подразумеваете под "стеком" ». Тот же GIL, общая память, то же время выполнения.

Не имеет значения, сколько потоков и процессов запущено, все они будут проходить в рамках одной среды выполнения?

Зависит от многопоточности / многопроцессорности.

Проще говоря, каково определение времени выполнения в контексте Python?

Среда выполнения буквально python.exe или /usr/bin/python. Это исполняемый файл Python, который будет интерпретировать ваш код Python путем преобразования его в читаемый процессором байт-код. Когда вы используете многопоточность, у вас работает только один python. Когда вы multiprocess у вас есть несколько python работает.


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

...