Python多进程Pool输出缩进错乱、CLI终端挂起问题求解
问题根因说明
- 输出错乱混叠(看起来像随机缩进):多进程场景下所有子进程共用同一个标准输出流(stdout),
print操作不是原子性的,多个进程同时打印时会出现不同进程的输出内容穿插、错位,表现为随机的多余缩进、内容乱序。 - 终端挂起无响应:进程池使用完后没有主动关闭释放资源,主进程会一直持有进程池的资源不退出,同时子进程可能处于僵尸状态残留占用终端IO。
解决方案
输出对齐无乱序的实现思路
每次子进程把本组要输出的内容先拼接成完整的单个字符串,再执行输出操作。如果需要完全按arg1的顺序输出,可以把结果返回到主进程统一打印,彻底避免穿插问题。
进程池资源正确释放
调用完map后主动执行my_pool.close()关闭进程池不再接收新任务,再调用my_pool.join()等待所有子进程执行完成后再退出主进程。
修改后完整代码
from multiprocessing import Pool from functools import partial def run_test_function(x, fun_arg2, fun_arg3, fun_arg4): # 先拼接所有输出内容为单个字符串,避免多次print被穿插 output_lines = [] for a in fun_arg2: for b in fun_arg3: output_lines.append(str(x)) output_lines.append(str(a)) output_lines.append(str(b)) output_lines.append(str(fun_arg4)) # 返回完整内容给主进程统一打印 return "\n".join(output_lines) if __name__ == "__main__": arg1 = 1,2,3,4 arg2 = "hello" arg3 = "world" arg4 = "!" process_func = partial(run_test_function, fun_arg2=arg2, fun_arg3=arg3, fun_arg4=arg4) my_pool = Pool(8) # 收集所有子进程的返回结果 result_list = my_pool.map(process_func, arg1) # 正确释放进程池资源,解决终端挂起问题 my_pool.close() my_pool.join() # 主进程统一按顺序打印,完全避免乱序 for res in result_list: print(res)
如果不需要严格按arg1的顺序输出,也可以选择在子进程内一次性打印拼接好的字符串,性能会更高:
# 子进程内一次性打印的版本(性能更高,输出顺序不保证) def run_test_function(x, fun_arg2, fun_arg3, fun_arg4): output_lines = [] for a in fun_arg2: for b in fun_arg3: output_lines.append(str(x)) output_lines.append(str(a)) output_lines.append(str(b)) output_lines.append(str(fun_arg4)) print("\n".join(output_lines), flush=True) # 加flush强制清空输出缓冲区
内容的提问来源于stack exchange,提问作者Vanshika
相关产品推荐
相关产品推荐

