Python多进程优化后控制台无输出,进程执行异常求助
多进程优化后无控制台输出及内核执行问题排查
尝试用Python的multiprocessing模块优化代码,从时间戳看优化后耗时大幅减少,但控制台看不到子进程的print输出,且尝试其他多进程代码时内核甚至无法执行,以下是问题排查和解决方法:
优化前代码
import time def counter1(num): cnt = 0 for _ in range(num): cnt += 1 print("counter 1 done") def counter2(num): cnt = 0 for _ in range(0,num,2): cnt += 1 print("counter 2 done") N = 2 * 10**8 # 单进程执行 st = time.time() counter1(N) counter2(N) en = time.time() print("time taken = ", en - st)
优化前输出
counter 1 done counter 2 done time taken = 20.462417602539062
优化后代码
import multiprocessing import time def counter1(num): cnt = 0 for _ in range(num): cnt += 1 print("counter 1 done") def counter2(num): cnt = 0 for _ in range(0,num,2): cnt += 1 print("counter 2 done") if __name__ == "__main__" : N = 2 * 10**8 # 单进程执行 st = time.time() counter1(N) counter2(N) en = time.time() print("time taken = ", en - st) # 多进程执行 st = time.time() p1 = multiprocessing.Process(target=counter1, args=(N, )) p2 = multiprocessing.Process(target=counter2, args=(N, )) p1.start() p2.start() p1.join() p2.join() en = time.time() print("time taken = ", en - st)
优化后输出
time taken = 0.10938787460327148
问题1:子进程print无输出的原因及解决
- 核心原因:Windows系统下,
multiprocessing创建的子进程标准输出默认处于缓冲状态,未刷新时内容不会显示到控制台;同时子进程的输出流与主进程可能不同步。 - 解决方法:
- 强制刷新输出:给
print添加flush=True参数print("counter 1 done", flush=True) - 使用队列传递输出(更可靠):通过
multiprocessing.Queue让子进程把输出内容传给主进程,由主进程统一打印import multiprocessing import time def counter1(num, queue): cnt = 0 for _ in range(num): cnt += 1 queue.put("counter 1 done") def counter2(num, queue): cnt = 0 for _ in range(0, num, 2): cnt += 1 queue.put("counter 2 done") if __name__ == "__main__": N = 2 * 10**8 # 单进程执行部分省略... # 多进程执行 st = time.time() output_queue = multiprocessing.Queue() p1 = multiprocessing.Process(target=counter1, args=(N, output_queue)) p2 = multiprocessing.Process(target=counter2, args=(N, output_queue)) p1.start() p2.start() # 打印子进程输出 print(output_queue.get()) print(output_queue.get()) p1.join() p2.join() en = time.time() print("time taken = ", en - st)
- 强制刷新输出:给
问题2:内核无法执行多进程代码的可能原因及解决
- 未正确使用
if __name__ == "__main__"::Windows系统下,必须将创建进程的代码放在这个判断分支内,否则子进程启动时会重复执行主模块代码,引发无限递归创建进程或报错。所有多进程相关的启动逻辑都要放在该判断里。 - 资源过载:
N = 2 * 10**8的循环会占用大量CPU资源,若系统内存或CPU不足,会导致内核无响应。建议先将N改为较小值(如2 * 10**6)验证多进程逻辑是否正常,再逐步调整。 - 系统权限或软件拦截:杀毒软件、防火墙可能会拦截Python创建子进程的操作,尝试关闭相关软件,或用管理员权限运行脚本。
- 环境异常:Python版本过低、
multiprocessing模块损坏,或虚拟环境有问题。可以尝试更新Python到稳定版本,或重建虚拟环境。
内容的提问来源于stack exchange,提问作者Aakash
相关产品推荐
相关产品推荐

