Процесс многопроцессорности Python по сравнению с автономной виртуальной машиной Python

Помимо простоты использования модуля multiprocessing, когда дело доходит до подключения процессов с ресурсами связи, существуют ли какие-либо другие различия между нерестом нескольких процессов с использованием multiprocessing по сравнению с использованием subprocess для запуска отдельных виртуальных машин Python

Ответ 1

На платформах Posix примитивы multiprocessing по существу переносят os.fork(). Это означает, что в момент, когда вы запускаете процесс многопроцессорности, уже импортированный/инициализируемый код остается таким же в дочернем процессе.

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

Имеются также последствия для таких ресурсов, как файловые дескрипторы, сокеты и т.д. с multiprocessing на unix-подобной платформе.

Между тем, при использовании subprocess вы создаете совершенно новую программу/интерпретатор каждый раз, когда вы Popen новый процесс. Это означает, что между ними может быть меньше общей памяти, но это также означает, что вы можете всплывать в полностью отдельную программу или новую точку входа в ту же программу.

В Windows различия меньше между multiprocessing и subprocess, потому что окна не предоставляют fork().

Ответ 2

Если вы игнорируете какие-либо проблемы связи (то есть, если отдельные виртуальные машины Python не обмениваются между собой или не связывают только с помощью других механизмов, которые явно установлены), других существенных различий нет. (Я полагаю, что multiprocessing, при определенных условиях - Unix-подобные платформы, в частности, могут использовать более эффективную fork, а не пару fork-exec, всегда подразумеваемую multiprocessing - но это не "существенное" когда задействовано всего несколько процессов [[IOW, разница в производительности при запуске не будет существенна для производительности всей системы]]).