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

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创建的子进程标准输出默认处于缓冲状态,未刷新时内容不会显示到控制台;同时子进程的输出流与主进程可能不同步。
  • 解决方法:
    1. 强制刷新输出:给print添加flush=True参数
      print("counter 1 done", flush=True)
      
    2. 使用队列传递输出(更可靠):通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:22:26