Чтобы ответить на ваш вопрос напрямую, должен быть какой-то побочный эффект external_process
, который делает так, что когда код запускается последовательно, вы получаете разные результаты, чем если бы вы запускали их одновременно. Это связано с тем, как вы настраиваете свой код, а также с отсутствием различий между os.fork
и multiprocessing.Process
в системах, которые поддерживают os.fork
.
Единственная реальная разница между os.fork
и multiprocessing.Process
заключается в переносимости и накладных расходах библиотеки, поскольку os.fork
не поддерживается в Windows, а multiprocessing
включена, чтобы заставить multiprocessing.Process
работать. Это связано с тем, что os.fork
вызывается multiprocessing.Process
, поскольку этот ответ поддерживает.
Таким образом, важным отличием является то, что os.fork
копирует все в текущем процессе, используя разветвление Unix, что означает, что во время разветвления оба процесса одинаковы с различиями PID. В Windows это эмулируется повторным запуском всего кода установки перед if __name__ == '__main__':
, что примерно аналогично созданию подпроцесса с использованием библиотеки subprocess
.
Для вас фрагменты кода, которые вы предоставляете, делают совершенно разные вещи, описанные выше, потому что вы вызываете external_function
в main, прежде чем открывать новый процесс во втором фрагменте кода, заставляя два процесса выполняться последовательно, но в разных процессах. Кроме того, канал не нужен, так как он не эмулирует функциональность из первого кода.
В Unix фрагменты кода:
import os
pid = os.fork()
if pid == 0:
os.environ['HOME'] = "rep1"
external_function()
else:
os.environ['HOME'] = "rep2"
external_function()
и:
import os
from multiprocessing import Process
def f():
os.environ['HOME'] = "rep1"
external_function()
if __name__ == '__main__':
p = Process(target=f)
p.start()
os.environ['HOME'] = "rep2"
external_function()
p.join()
должен делать то же самое, но с небольшими дополнительными накладными расходами из-за прилагаемой библиотеки многопроцессорности.
Без дополнительной информации мы не можем понять, в чем проблема. Если вы можете предоставить код, демонстрирующий проблему, это поможет нам вам помочь.
person
Poik
schedule
04.06.2014
external_function
вот так:def external_function(): print os.environ['HOME']
и обнаружил, что примерmultiprocessing
вывел именно то, что я ожидал; 'rep1', 'rep2' и строка, которую я отправил обратно изconn.send
, были напечатаны. - person dano   schedule 04.06.2014getInstalledPackages
из github.com/vle-forge. /pyvle/blob/master/src/pyvle.py. - person Hunsu   schedule 04.06.2014