You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数内启动多进程引发父函数重复执行的问题咨询

问题成因与解决方案

嘿,这个坑我之前刚踩过!你遇到的问题核心原因是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()

额外说明

  1. 去掉了多余的function_load函数,直接在function_start里启动进程即可——没必要把启动逻辑封装在一个带if __name__判断的函数里,这个判断只需要在顶层出现一次。
  2. 当你后续用tkinter做GUI时,启动多进程的按钮回调函数可以直接调用function_start(),但要确保整个GUI的启动代码也放在if __name__ == '__main__':块里,避免同样的重复执行问题。

内容的提问来源于stack exchange,提问作者Dava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 02:52:36