函数内启动多进程引发父函数重复执行的问题咨询
问题成因与解决方案
嘿,这个坑我之前刚踩过!你遇到的问题核心原因是Windows系统下多进程的启动机制,再加上代码里if __name__ == '__main__':的位置完全错了。
为什么会出现“回到父函数开头重新执行”?
Windows不像Linux/macOS有fork系统调用,它创建子进程的方式是重新导入整个脚本文件。也就是说,当你启动p1和p2这两个子进程时,Python会重新运行你的整个代码文件——包括顶层的function_start()调用!这就导致子进程启动时,又会从头执行function_start(),看起来像是程序“回到父函数开头”了。
你看第一个代码里,function_start()是直接写在顶层的(没有被任何条件包裹),子进程启动时必然会重新执行它;第二个代码里如果去掉注释调用function_start(),同样会遇到这个问题。另外,你把if __name__ == '__main__':放在function_load函数内部也是错误的,这个判断应该只出现在顶层代码中,用来区分主进程和子进程的执行逻辑。
修复方案
核心原则:所有需要在主进程中执行的顶层代码(比如启动程序的入口),必须放在if __name__ == '__main__':块里。这样子进程重新导入脚本时,因为__name__不再是__main__,就不会执行这块代码。
修改后的代码示例(基于你的第一个版本):
import multiprocessing import time from multiprocessing import Pipe def function_start(): print("GAME DETECTED AND STARTED") parent_conn, child_conn = Pipe() p1 = multiprocessing.Process(target=function_first_process_loop, args=(child_conn,)) p2 = multiprocessing.Process(target=function_second_process_loop, args=(parent_conn,)) # 直接启动进程,不用再套一层function_load p1.start() p2.start() def function_first_process_loop(conn): x=0 print("FIRST PROCESS STARTED") while True: time.sleep(1) x += 1 conn.send(x) print(x) def function_second_process_loop(conn): print("SECOND PROCESS STARTED") while True: data = conn.recv() print(data) # 关键:把程序入口放在这个判断块里 if __name__ == '__main__': function_start()
额外说明
- 去掉了多余的
function_load函数,直接在function_start里启动进程即可——没必要把启动逻辑封装在一个带if __name__判断的函数里,这个判断只需要在顶层出现一次。 - 当你后续用tkinter做GUI时,启动多进程的按钮回调函数可以直接调用
function_start(),但要确保整个GUI的启动代码也放在if __name__ == '__main__':块里,避免同样的重复执行问题。
内容的提问来源于stack exchange,提问作者Dava
相关产品推荐
相关产品推荐

