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