“我应该只出现一次”的语句应该只出现一次。我不明白为什么还会再出现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
答案 0 :(得分:5)
这是Windows(RuntimeError on windows trying python multiprocessing)的经典问题,
当您在Windows上使用多处理时,该过程不是分叉的,而是重复的(因为fork
在Windows操作系统中不存在)使用了一些棘手的机制来“模拟” fork
,但没有准确,因为操作系统不允许(What's the best way to duplicate fork() in windows?)。
因此,除非您使用__name__ == "__main__"
(您也可以通过移动该范围内的大多数import
语句来加快工作人员的启动速度)