为何Python多进程未生效?附代码求原因解析
咱们一步一步排查多进程开发里的常见坑:
主进程提前退出,子进程被强制终止
你的代码启动两个子进程后,主进程就直接跑完Main()函数退出了。在大多数操作系统中,主进程退出时会强制终止所有尚未完成的子进程,导致子进程根本没机会真正执行起来。
解决方法很简单,在启动进程后加上join()方法,让主进程等待子进程执行完毕:pJames.start() p2.start() # 等待子进程执行完毕后再退出主进程 pJames.join() p2.join()子进程抛出异常但无输出提示
子进程的默认行为是:如果执行时抛出异常,不会在主进程的控制台打印任何信息,看起来就像“没运行”。你可以给目标方法加上异常捕获,或者临时把进程调用改成直接调用(比如在Main()里直接执行main.detect_James()和screen.screen()),看看会不会暴露报错信息。
举个异常捕获的例子,修改detect_James方法:# 在MainController类里调整detect_James方法 def detect_James(self): try: # 原方法逻辑 print("detect_James 开始运行!") except Exception as e: print(f"detect_James 执行出错: {e}")Windows系统下的多进程启动兼容性问题
如果你在Windows上运行代码,multiprocessing默认用spawn方式启动子进程,这会重新导入主模块和依赖模块。如果MainController或Screen模块里有未被if __name__ == '__main__':包裹的直接执行代码,子进程启动时会重复执行这些代码,可能导致初始化错误甚至死循环。
检查这两个模块的代码,确保所有入口执行代码都被if __name__ == '__main__':包裹。目标方法本身的逻辑问题
还有一种可能是detect_James和screen方法本身的逻辑导致它们立即退出——比如方法是空的,或者刚执行就遇到return、break之类的语句。你可以在这两个方法的开头加一句打印,比如print("Screen 进程已启动!"),如果启动进程后看不到这些打印,基本就能确定是前面的问题;如果能看到,那就要排查方法内部的逻辑了。
内容的提问来源于stack exchange,提问作者Robbe Jaeken

