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

2024-09-28 22:43:59 发布

您现在位置:Python中文网/ 问答频道 /正文

“我应该只出现一次”这句话应该只出现一次。我不明白为什么它还会出现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

Tags: onlytimeprintshouldzeitoncesekappear
1条回答
网友
1楼 · 发布于 2024-09-28 22:43:59

这是windows(RuntimeError on windows trying python multiprocessing)的经典问题,只是没有那么引人注目

当您在windows上使用多处理时,进程不是分叉的,而是重复的(因为fork在windows操作系统中不存在),使用一些复杂的机制来“模拟”fork,但不准确,因为操作系统不允许它(What's the best way to duplicate fork() in windows?

因此,语句的打印次数与进程的打印次数相同,除非您使用__name__ == "__main__"保护它

(也可以通过移动该范围内的大多数import语句来加快workers的启动速度)

相关问题 更多 >