Общие Библиотеки Python


Насколько я понимаю, в python есть два типа модулей (CPython): - самой .так что (расширение с ) - the. py

. so загружаются только один раз, даже если существуют различные процессы/интерпретаторы, импортирующие их.

. py загружаются один раз для каждого процесса/интерпретатора (если только не выполняется явная перезагрузка).

Есть ли способ. py может быть совместно использован несколькими процессами / интерпретаторами?

Все равно нужен какой-то слой, где можно было бы хранить изменения, сделанные в модуль. Я думаю, что можно было бы встроить интерпретатор в a. so в качестве первого шага. Есть ли уже разработанное решение.

Я признаю, что могу быть очень далек в плане осуществимых идей по этому поводу. Пожалуйста, простите мое невежество.
3 3

3 ответа:

Причина, по которой файлы .so (или .pyd) занимают место в памяти только один раз (за исключением сегмента переменных), заключается в том, что они распознаются ядром ОС как объектный код. .py файлы распознаются только как текстовые файлы / данные; это интерпретатор Python, который предоставляет им статус "код". Встраивание интерпретатора Python в общую библиотеку не решит эту проблему.

Загрузка .py файлов только один раз, несмотря на их использование в нескольких процессах, потребует изменений глубоко внутри CPython.

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

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

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

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

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

У Python уже есть третий способ загрузки модулей. Если это возможно, то при загрузке файла. py он создает предварительно скомпилированный файл .pyc-файл, который быстрее загружается (Вы избегаете компиляции). В следующий раз он загружает свой .файл pyc. Они вполне могли это сделать .pyc-файл, просто поместив его в память. (Используя MAP_PRIVATE на случай, если другие вещи испортят этот байт-код позже.) Если бы они это сделали, то общие модули по умолчанию оказались бы в общей памяти.

Понятия не имею. действительно ли она была реализована таким образом.