#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. Это имеет смысл, спасибо за ваш вклад!