Общие библиотеки Python - PullRequest
       5

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

3 голосов
/ 21 февраля 2011

Как я понимаю, в Python есть два типа модулей (CPython): - .so (расширение C) - .py

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 21 февраля 2011

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

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

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

0 голосов
/ 21 февраля 2011

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

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

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

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

Я понятия не имею, была ли она реализована таким образом.

0 голосов
/ 21 февраля 2011

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

...