На платформах Posix multiprocessing
примитивы по существу обертывают os.fork()
. Это означает, что в момент, когда вы запускаете процесс в многопроцессорной среде, уже импортированный / инициализированный код остается в дочернем процессе.
Это может быть благом, если у вас есть много вещей для инициализации, а затем каждый подпроцесс по существу выполняет операции (копии) этих инициализированных объектов, но не все это полезно, если вещь, которую вы запускаете в подпроцессе, совершенно не связана.
Существуют также последствия для таких ресурсов, как файловые дескрипторы, сокеты и т. Д. С multiprocessing
на Unix-подобной платформе.
Между тем, когда вы используете subprocess
, вы создаете совершенно новую программу / интерпретатор каждый раз, когда Popen
создаете новый процесс. Это означает, что между ними может быть меньше общей памяти, но это также означает, что вы можете использовать Popen в совершенно отдельной программе или в новой точке входа в ту же программу.
В Windows различия между multiprocessing
и subprocess
меньше, потому что Windows не предоставляет fork()
.