Загрузка двух экземпляров динамической библиотеки в Python - PullRequest
1 голос
/ 23 марта 2019

У меня есть программа, написанная на Фортране и скомпилированная (с -fPIC) в виде динамической библиотеки. Я загружаю с CDLL в Python для выполнения некоторых численных расчетов. Библиотека использует внутреннюю постоянную память (в модулях) для сохранения промежуточных значений. Я работаю как в Windows, так и в Linux (с .dll и .so соответственно). Динамическая библиотека упакована внутри модуля Python и установлена ​​в подкаталоге lib.

Если я запускаю два разных скрипта Python, которые загружают динамическую библиотеку на один и тот же компьютер, они получат отдельную внутреннюю память или получат доступ к одному и тому же (таким образом, искажая результаты)?

Как это повлияет, если я:

  • Загрузите их в другой многопроцессорный экземпляр
  • Загрузить их в другой экземпляр многопоточности
  • Загрузите их в два разных ноутбука Jupyter с разным ядром
  • Запускать их в разных виртуальных средах Python

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

1 Ответ

1 голос
/ 24 марта 2019

Если я запускаю два разных скрипта Python, которые загружают динамическую библиотеку на один и тот же компьютер, они получат отдельную внутреннюю память или получат доступ к одному и тому же (таким образом, искажая результаты)?

  • Одна и та же библиотека может быть загружена только один раз ; точнее, если вы попытаетесь загрузить библиотеку с тем же путем, она загружается только один раз в процессе.

    • Теперь предположим, что вы загружаете библиотеку, копируете / вставляете эту библиотеку в другое место, переименовываете ее и пытаетесь загрузить копию, после чего она загружается дважды.
  • Что касается памяти, используемой одной и той же библиотекой, загруженной несколько раз, поскольку вы загружаете только одну библиотеку, повреждений нет. Если вы загрузите его копию, то каждая из этих библиотек получит свои собственные выделения памяти.

Загрузить их в другой многопроцессорный экземпляр

Нет проблем. многопроцессорная обработка использует разные процессы, и разные процессы не могут перезаписать что-либо в адресное пространство другого процесса (если только явно не запросило его).

Загрузить их в другой многопоточный экземпляр

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

Как вы сказали, библиотека поддерживает внутреннее состояние, каждый вызов функции имеет возможность перезаписать / изменить предыдущее внутреннее состояние (в зависимости от влияния вызываемой функции на внутреннее состояние).

Загрузите их в два разных ноутбука Jupyter с разным ядром

Зависит от того, используют ли два ноутбука два разных экземпляра переводчика.

  • Если это один и тот же интерпретатор с двумя записными книжками, то у вас есть только один экземпляр вашей библиотеки, загруженный интерпретатором.

  • Различные интерпретаторы: два процесса -> две библиотеки, каждая со своим отдельным состоянием.

Запускайте их в разных виртуальных средах Python

В разных виртуальных средах используются разные процессы.

...