作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
“我应该只出现一次”这句话应该只出现一次。我无法理解为什么它又出现了 3 次...我很清楚我的代码正在执行 3 个进一步的进程。但是在这 3 个进程中,只有 funktion0()
被调用。为什么声明 “我应该只出现一次”
包含在这额外的 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
最佳答案
这是 Windows 的经典问题 (RuntimeError on windows trying python multiprocessing),只是不那么引人注目。
当您在 Windows 上使用多处理时,进程不是 fork 而是重复(因为 fork
在 Windows 操作系统中不存在)使用一些棘手的机制来“模拟”fork
但不准确,因为操作系统不允许 ( What's the best way to duplicate fork() in windows? )。
所以语句的打印次数与进程的次数一样多,除非你用 __name__ == "__main__"
保护它
(您也可以通过在该范围内移动大多数 import
语句来加速 workers 启动)
关于python - 为什么在使用 concurrent.futures.ProcessPoolExecuter() 进行多处理期间不止一次打印此消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54495669/
“我应该只出现一次”这句话应该只出现一次。我无法理解为什么它又出现了 3 次...我很清楚我的代码正在执行 3 个进一步的进程。但是在这 3 个进程中,只有 funktion0() 被调用。为什么声明
我是一名优秀的程序员,十分优秀!