Python 多处理模块意外输出.可能是什么原因?



我正在学习Python的多处理模块。我使用的是Python 3.8。这是我的示例代码:

# import stuff
def add(x, y):
time.sleep(10)
print(f'{x + y} n')

def main():
start = time.perf_counter()
if __name__ == '__main__':
p1 = mp.Process(target=add, args=(100, 200))
p2 = mp.Process(target=add, args=(200, 300))
p1.start(); p2.start()
p1.join(); p2.join()
end = time.perf_counter()
print(f'{end - start} seconds n')

main()

我期待这样的输出:

300
500
10.something seconds

但是当我运行它时,我得到:

5.999999999062311e-07 seconds 
5.00000000069889e-07 seconds 

500 
300 
10.704853300000002 seconds

出于某种原因,end = time.perf_counter(); print(f'{end - start} seconds n')部分在每个进程启动后执行一次,在它们都结束后再执行一次。但在这里,我专门编写p1.join(); p2.join(),告诉计算机等到这些过程完成,然后继续执行以下代码行。

为什么会这样?我能做些什么来修复它?

发生这种情况是因为您在不支持fork的Windows上运行。在 Linux 上,我看到了您期望的输出。由于 Windows 无法分叉,因此它必须在每个子进程中重新导入整个模块才能运行工作线程函数。由于您没有保护在if __name__ == "__main__":防护中计算/打印运行时的代码,因此它们在启动时会在两个工作进程中执行,此外,工作线程完成后还会在主进程中运行。将它们(以及您只想在父进程中运行的任何其他代码(移动到保护中以获取所需的输出:

# import stuff
def add(x, y):
time.sleep(10)
print(f'{x + y} n')

def main():
p1 = mp.Process(target=add, args=(100, 200))
p2 = mp.Process(target=add, args=(200, 300))
p1.start(); p2.start()
p1.join(); p2.join()

if __name__ == '__main__':
main()

最新更新