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()回收,进程退出时输出缓冲区不会被主动刷新。 - 标准输出缓冲问题:子进程的标准输出默认使用块缓冲模式,打印内容不足缓冲区阈值时会暂存在内存中,不主动刷新的话内容不会输出到控制台,进程异常退出时这部分内容会直接丢失。
修复方案
按以下步骤修改代码即可正常输出:
- 修正所有主逻辑的缩进,所有进程创建、启动逻辑必须放在
if __name__ == '__main__':块内 - 修正进程传参格式,单元素参数必须写成
args=(x,)格式保证传入的是元组 - 删掉错误的
p.run()调用,p.start()即可自动拉起子进程执行目标函数 - 把进程加入列表的
append逻辑移到for循环内部,保证所有创建的进程都能被统一join回收 - 解决输出缓冲问题,二选一即可:
- 所有
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
相关产品推荐
相关产品推荐

