Что такое время выполнения в контексте Python? Из чего он состоит?

В контексте этого вопроса https://stackoverflow.com/questions/3900549/what-is-runtime/3900561

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

  1. Процесс Python, содержащий все переменные времени выполнения.
  2. ГИЛ
  3. Базовый код интерпретатора (CPython и т. д.).

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

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

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

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

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


person sprksh    schedule 18.02.2020    source источник


Ответы (1)


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

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

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

Процесс

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

Нить

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


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

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

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

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

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

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

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

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

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

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

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


Когда вы создаете поток через библиотеку threading, вы фактически создаете задания внутри одной среды выполнения 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.


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

person Felipe    schedule 18.02.2020
comment
Этот ответ охватывает ширину вопроса и добавляет ресурсы (как вы упомянули), но не проникает в глубину, которую я ожидаю. +1 за то же самое. - person sprksh; 18.02.2020
comment
Lmk, как я мог бы уточнить это дальше! Тема очень широкая, поэтому сложно определить, что именно нужно углублять. - person Felipe; 18.02.2020