Python multiprocessing模块无法同时启动两个函数是什么原因
问题根源
你的代码无法实现两个函数并行执行的核心错误是join()方法的调用时机不对。join()方法的作用是阻塞当前主进程,直到被调用的子进程完全执行结束,才会继续执行主进程后续的代码。你当前代码的执行流程是完全串行的:
- 主进程创建p1进程,调用
p1.start()启动p1后,立刻执行p1.join() - 主进程在
p1.join()处阻塞,等待p1执行完print1逻辑、10秒休眠结束、进程退出后,才会继续往下运行 - p1结束后,主进程才会创建p2、启动p2,再调用
p2.join()等待p2执行完毕
整个流程两个子进程没有任何重叠的运行时间,总耗时约20秒,自然达不到并行效果。
修正方案
把所有进程的start()调用和join()调用分开,先把所有子进程全部启动,再逐个调用join()等待进程结束即可。修正后的代码如下:
from multiprocessing import Process import time as t def print1(): print(1) t.sleep(10) def print2(): print(2) # 调整输出值方便区分两个进程的执行,不影响并行逻辑 t.sleep(10) if __name__ == '__main__': p1 = Process(target = print1) p2 = Process(target = print2) # 先启动全部子进程 p1.start() p2.start() # 所有进程启动完成后再统一等待结束 p1.join() p2.join()
修正后两个子进程会几乎同时启动,运行时间重叠,总耗时约10秒,符合并行执行的预期。
补充说明:start()才是启动子进程的唯一必要操作,join()只是用来做进程同步、等待子进程退出的方法,不需要在启动单个进程后立刻调用。
内容的提问来源于stack exchange,提问作者kamazz
相关产品推荐
相关产品推荐

