Почему это сообщение печатается более одного раза во время многопроцессорной обработки с помощью concurrent.futures.ProcessPoolExecuter ()? - PullRequest
0 голосов
/ 02 февраля 2019

Утверждение «Я должен появиться только один раз» должно появиться только один раз.Я не могу понять, почему это появляется еще 3 раза ... Мне ясно, что мой код выполняет еще 3 процесса.Но в этих 3 процессах вызывается только funktion0().Почему утверждение "I should appear only once" включается в эти дополнительные 3 процесса?Может ли кто-нибудь объяснить?

Код:

from datetime import datetime
#print(datetime.now().time())

from time import time, sleep
#print(time())
print("I should appear only once")
from concurrent import futures


def funktion0(arg0):
    sleep(arg0)
    print(f"ich habe {arg0} sek. gewartet, aktuelle Zeit: {datetime.now().time()}")

if __name__=="__main__":

    with futures.ProcessPoolExecutor(max_workers=3) as obj0:
        obj0.submit(funktion0, 5)
        obj0.submit(funktion0, 10)
        obj0.submit(funktion0, 15)
        obj0.submit(funktion0, 20)
        print("alle Aufgaben gestartet")

    print("alle Aufgaben erledigt")

Ожидаемый результат:

I should appear only once
alle Aufgaben gestartet
ich habe 5 sek. gewartet, aktuelle Zeit: 18:32:51.926288
ich habe 10 sek. gewartet, aktuelle Zeit: 18:32:56.923648
ich habe 15 sek. gewartet, aktuelle Zeit: 18:33:01.921168
ich habe 20 sek. gewartet, aktuelle Zeit: 18:33:11.929370
alle Aufgaben erledigt

Фактический результат:

I should appear only once
alle Aufgaben gestartet
I should appear only once
I should appear only once
I should appear only once
ich habe 5 sek. gewartet, aktuelle Zeit: 18:32:51.926288
ich habe 10 sek. gewartet, aktuelle Zeit: 18:32:56.923648
ich habe 15 sek. gewartet, aktuelle Zeit: 18:33:01.921168
ich habe 20 sek. gewartet, aktuelle Zeit: 18:33:11.929370
alle Aufgaben erledigt

1 Ответ

0 голосов
/ 02 февраля 2019

Это классическая проблема с окнами ( RuntimeError в окнах, в которых используется многопроцессорная обработка Python ), только менее драматичная.

Когда вы используете многопроцессорность в Windows, процесс не разветвляется, а дублируется(потому что fork не существует в Windows OS), используя какой-то хитрый механизм для "эмуляции" fork, но не точно, потому что ОС не позволяет этого ( Какой лучший способ дублировать fork () в Windows?).

Таким образом, заявление печатается столько раз, сколько существует процессов, если вы не защитите его с помощью __name__ == "__main__"

(вы, вероятно, можете ускорить запуск рабочих, переместив большинство import заявления в этой области тоже)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...