Многопроцессорность Python: почему использование процесса запускает мою программу с самого начала?

#python #multithreading #multiprocessing

#python #многопоточность #многопроцессорная обработка

Вопрос:

У меня возникли некоторые проблемы с выяснением, почему моя консоль всегда печатает операторы печати, которые у меня были в начале моего файла. Вот как это выглядит:

 from multiprocessing import Process
import time

print('hello')  # why does this get printed over and over again?


def func1(num):
    print(num ** 2)
    time.sleep(1)


def func2(num):
    print(num ** 3)
    time.sleep(1)


if __name__ == '__main__':
    counter = 0
    while counter < 10:
        proc1 = Process(target=func1, args=[2])
        proc2 = Process(target=func2, args=[2])
        proc1.start()
        proc2.start()
        proc1.join()
        proc2.join()
        counter  = 1
  

как только я его запускаю: он печатает «Привет» в каждом цикле. Я уверен, что я просто совершаю глупую ошибку, но любая помощь была бы отличной, спасибо.

Комментарии:

1. Похоже, ваш код в порядке, когда я его запускаю, «hello» печатается только один раз, а затем 4 и 8 печатаются повторяющимся образом.

2. @Benjamin — Какую операционную систему вы используете? Вы получите печать несколько раз в Windows, которая порождает новые экземпляры python.

Ответ №1:

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

В вашем случае print это на уровне модуля, поэтому оно выполняется как часть импорта в подпроцессе. Если это был "__main__" модуль, вы можете просто поместить этот print в if __name__ == "__main__": предложение. Когда он импортируется как модуль, а не выполняется как скрипт, эта печать не выполняется.

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

Комментарии:

1. Это имеет смысл, спасибо за ваш вклад!