使用multiprocessing时input与其他代码并行触发EOF错误如何解决?
问题原因
你遇到的EOFError核心原因是:Windows平台下Python的multiprocessing模块默认使用spawn方式启动子进程,子进程不会继承主进程的标准输入流(stdin)。当子进程内部调用input()函数尝试读取stdin时,没有可读内容直接触发EOF结束标志,因此抛出错误。Linux/macOS默认用fork启动可能暂时没这个问题,但跨平台运行依然会有兼容风险。
解决方案1:用多线程替代多进程(推荐)
input属于IO密集型操作,多线程完全可以实现并行运行的需求,而且线程共享当前进程的stdin,不会出现流读取异常,实现成本最低无兼容问题,代码示例如下:
import threading def test1(): input('hello') def test2(): while True: b = 5 if __name__ == "__main__": t1 = threading.Thread(target=test1) t2 = threading.Thread(target=test2) t1.start() t2.start() t1.join() t2.join()
解决方案2:必须用多进程的场景,通过队列中转输入
如果你的逻辑必须依赖多进程(比如存在CPU密集型计算任务),不要在子进程内直接调用input,改为由主进程统一读取输入,再通过multiprocessing.Queue传递给子进程,代码示例如下:
import multiprocessing def test1(input_queue): # 子进程不再直接调用input,从队列获取主进程传入的输入内容 print('hello', end='', flush=True) user_input = input_queue.get() # 后续处理user_input的逻辑 print(f"收到输入:{user_input}") def test2(): while True: b = 5 if __name__ == "__main__": input_queue = multiprocessing.Queue() p1 = multiprocessing.Process(target=test1, args=(input_queue,)) p2 = multiprocessing.Process(target=test2) p1.start() p2.start() # 主进程负责读取input,写入队列传递给子进程 user_input = input() input_queue.put(user_input) p1.join() p2.join()
内容的提问来源于stack exchange,提问作者Pingy
相关产品推荐
相关产品推荐

