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

Python multiprocessing创建的子进程无法正常打印输出

问题根因

你的代码存在5个直接导致子进程无输出的硬逻辑/语法错误,和运行平台、IDE无关:

  • 缩进错误:Python以缩进划分代码块,if __name__ == '__main__': 下的所有主逻辑没有缩进,解释器无法识别多进程要求的主执行入口,Windows默认spawn启动模式下会直接触发子进程递归启动失败。
  • 进程传参格式错误:multiprocessing.Process的args参数要求传入可迭代的参数元组,你写的args = (x) 不是元组(单元素元组必须在元素后加尾随逗号),会导致子进程接收参数数量不匹配,启动后直接报错退出,自然没有输出。
  • 进程启动逻辑错误:你同时调用了p.start()和p.run(),run()是在当前主进程直接执行目标函数的方法,不会拉起子进程,还会阻塞主进程的循环逻辑,完全违背多进程的执行逻辑。
  • 进程回收逻辑错误:process_list.append(p) 写在了创建进程的for循环外部,循环创建的所有进程里只有最后一个会被加入列表,前面的进程没有被正确join()回收,进程退出时输出缓冲区不会被主动刷新。
  • 标准输出缓冲问题:子进程的标准输出默认使用块缓冲模式,打印内容不足缓冲区阈值时会暂存在内存中,不主动刷新的话内容不会输出到控制台,进程异常退出时这部分内容会直接丢失。
修复方案

按以下步骤修改代码即可正常输出:

  1. 修正所有主逻辑的缩进,所有进程创建、启动逻辑必须放在if __name__ == '__main__': 块内
  2. 修正进程传参格式,单元素参数必须写成args=(x,) 格式保证传入的是元组
  3. 删掉错误的p.run()调用,p.start() 即可自动拉起子进程执行目标函数
  4. 把进程加入列表的append逻辑移到for循环内部,保证所有创建的进程都能被统一join回收
  5. 解决输出缓冲问题,二选一即可:
    • 所有print语句加flush=True参数,每次打印后主动刷新缓冲区
    • 运行脚本时使用python -u Main.py命令启动,强制关闭标准输出/错误的缓冲机制

修复后的可直接运行代码如下:

Example.py

#Example.py
import sys
import os

def check_n(x):
    print("The arguments are: " , str(sys.argv), flush=True)
    print("Access Granted", flush=True)
    print(f"Check_n is being read: {x}", flush=True)
    sys.stdout.write('gfg\n')
    sys.stdout.flush()
    return 0

Main.py

#Main.py
import multiprocessing
import Example

# 替换为你实际的df_Pos定义,此处为测试用例
df_Pos = [1, 2, 3, 4]

if __name__ == '__main__':
    process_list = []
    for x in df_Pos:   
        print(x, flush=True)
        p =  multiprocessing.Process(target=Example.check_n, args=(x,))
        p.start()   
        process_list.append(p)
    
    for process in process_list:
        process.join()

测试说明:修复后的代码在系统控制台、VS Code、PyCharm下均可正常打印所有子进程输出,不需要额外修改IDE配置。如果把目标函数和启动逻辑写在同一个文件里,只要遵守上述的缩进、传参、启动、缓冲规则,同样可以正常输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:54:33