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

Python多进程在Windows系统无法正常运行的问题求助

Windows下Python多进程print无输出的问题解决

我看你在Windows上跑这段多进程代码的时候,子进程里的print完全没输出,只看到了Starting和Done,但Linux和在线环境都正常对吧?我之前也碰到过这个坑,给你捋捋原因和解决办法。

先把你的代码贴出来方便参考:

from multiprocessing import Process
from time import sleep

def worker(msg):
    for i in range(0, 10):
        print(msg, end='', flush=True) # <----- print msg

print('Starting')
t2 = Process(target=worker, args=('A',))
t3 = Process(target=worker, args=('B',))
t4 = Process(target=worker, args=('C',))
t2.start() # <---------------------------
t3.start() # <----- they don't work -----
t4.start() # <---------------------------
t2.join()
t3.join()
t4.join()
print('Done')

为啥Windows上会出问题?

这是因为Windows和Linux的多进程实现逻辑不一样:Linux用fork机制,子进程会直接继承父进程的文件描述符(包括控制台输出流stdout);但Windows用的是spawn机制,启动子进程时会重新启动一个Python解释器、重新加载你的脚本,这时候子进程的stdout没法和父进程的控制台正确关联,哪怕你加了flush=True也没用。而且如果没做特殊处理,子进程还会重复执行主进程里的启动代码,进一步打乱输出逻辑。

解决办法

最靠谱的方案是先给代码加上Windows多进程的标准防护:

方案1:把进程启动代码放到if __name__ == '__main__':块里

这是Windows上跑多进程的硬性要求,既能避免子进程重复执行启动逻辑,也能让子进程的输出正确关联到控制台。修改后的代码如下:

from multiprocessing import Process

def worker(msg):
    for i in range(0, 10):
        print(msg, end='', flush=True)

if __name__ == '__main__':
    print('Starting')
    t2 = Process(target=worker, args=('A',))
    t3 = Process(target=worker, args=('B',))
    t4 = Process(target=worker, args=('C',))
    t2.start()
    t3.start()
    t4.start()
    t2.join()
    t3.join()
    t4.join()
    print('Done')

你先试试这个,大部分情况下加上这个判断后,子进程的输出就能正常显示了。

方案2:显式指定进程启动方式(可选)

如果加了上面的判断还是有问题,可以显式指定用forkserver或者spawn启动进程,进一步确保输出正常:

from multiprocessing import get_context

def worker(msg):
    for i in range(0, 10):
        print(msg, end='', flush=True)

if __name__ == '__main__':
    # 显式指定启动上下文
    ctx = get_context('forkserver')
    Process = ctx.Process
    
    print('Starting')
    t2 = Process(target=worker, args=('A',))
    t3 = Process(target=worker, args=('B',))
    t4 = Process(target=worker, args=('C',))
    t2.start()
    t3.start()
    t4.start()
    t2.join()
    t3.join()
    t4.join()
    print('Done')

方案3:重定向输出到文件(适合不需要控制台实时输出的场景)

如果只是需要记录输出内容,不一定要在控制台看,可以让子进程把输出写到文件里:

from multiprocessing import Process

def worker(msg, file_path):
    with open(file_path, 'a', encoding='utf-8') as f:
        for i in range(0, 10):
            f.write(msg)
            f.flush()

if __name__ == '__main__':
    print('Starting')
    # 启动进程时传入输出文件路径
    t2 = Process(target=worker, args=('A', 'output.txt'))
    t3 = Process(target=worker, args=('B', 'output.txt'))
    t4 = Process(target=worker, args=('C', 'output.txt'))
    t2.start()
    t3.start()
    t4.start()
    t2.join()
    t3.join()
    t4.join()
    print('Done')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:22:42