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
相关产品推荐
相关产品推荐

