在使用concurrent.futures.ProcessPoolExecuter()进行多处理期间,为什么会多次打印此消息?

vos*_*eta 6 python windows python-3.x

声明"我应该只出现一次"应该只出现一次.我无法理解为什么它会出现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")
Run Code Online (Sandbox Code Playgroud)

预期产量:

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

Run Code Online (Sandbox Code Playgroud)

实际产量:

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
Run Code Online (Sandbox Code Playgroud)

Jea*_*bre 5

这是Windows的经典问题(Windows上的RuntimeError尝试python多处理)只是不那么引人注目.

当您在Windows上使用多处理时,该过程不是分叉但是重复(因为fork在Windows操作系统中不存在)使用一些棘手的机制来"模拟" fork但不准确,因为操作系统不允许它(什么是最好的方法)在Windows中复制fork()?).

所以语句打印的次数与进程一样多,除非你用它来保护它 __name__ == "__main__"

(你可以通过移动import该范围内的大多数语句来加速工人启动)