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

multiprocessing.Process启动后input失效持续打印提示符问题

问题描述

启动multiprocessing.Process()运行代码时,程序未按照预期逻辑执行,示例代码如下:

from multiprocessing import Process
from sys import exit


class Game():
    def __init__(self):
        self.cmd = ''
        self.balance = 1000

    def load_cmd(self):
        if self.cmd == 'quit':
            # 退出游戏
            exit()

        if self.cmd == 'balance':
            print('Total balance:', self.balance)

    def start(self):
        while True:
            try:
                self.cmd = input('?> ')
                self.load_cmd()
                print('\n')
            
            except EOFError:
                self.cmd = 'quit'


if __name__ == '__main__':
    # 加载游戏
    game = Game()
    Process(target = game.start).start()

实际运行现象:程序显示?>提示符后并未等待用户输入,而是持续无换行打印?>提示符,用户无法输入任何内容。如果不启动多进程、直接在主进程运行对应函数,所有功能均可正常执行。

异常产生原因
  • 核心是多进程标准输入的继承机制问题:Windows平台下multiprocessing默认使用spawn模式创建子进程,子进程不会继承父进程绑定到终端的标准输入(stdin)句柄,子进程的stdin本身没有连接到任何有效输入源。
  • 子进程执行到input('?> ')尝试读取输入时,因为stdin没有接入终端输入流,会立刻抛出EOFError,完全不会阻塞等待用户输入。
  • 代码的异常捕获逻辑触发了死循环:EOFError是在input()调用行直接抛出的,后续的self.load_cmd()根本没有执行机会;虽然在except块中写了self.cmd = 'quit',但这行只是修改实例变量,并没有触发退出逻辑。异常处理完成后代码直接回到while True循环起点,再次执行input('?> ')打印提示符、再次触发EOFError,就形成了无限刷屏打印?>的现象。
  • 直接在主进程运行时,主进程的stdin正常绑定到当前终端,input()可以正常阻塞等待用户输入,因此不会出现该问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:48:17