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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:18:02