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

为何Thread.start()启动缓慢?大量线程启动停滞问题排查

为什么Python线程创建到一半停滞无法继续?

你的代码出现停滞的原因主要有两个核心问题:

1. 超出系统线程资源上限

你尝试创建100万个线程,但任何操作系统能支持的线程数量都是有限的:

  • 每个线程都需要独立的栈空间(Python默认线程栈大小在Linux下通常是8MB左右),100万个线程仅栈空间就需要8TB内存,这显然远远超出了普通机器的硬件极限。
  • 操作系统的进程调度、线程管理也有自身的上限,当线程数量达到系统能承载的临界点时,新的线程无法被创建,程序就会陷入停滞状态。

2. 内存瞬间耗尽

你的load函数中print(list(range(1000000000)))会生成一个包含10亿个整数的列表:

  • 每个Python整数对象在64位系统中大约占用28字节,10亿个整数需要的内存超过25GB,这会直接耗尽机器的可用内存,甚至触发虚拟内存交换,导致系统彻底卡顿,后续线程根本没有机会启动执行。

修复建议

针对你的测试需求,可以做以下调整:

  • 大幅减少线程数量:测试多线程性能不需要创建百万级线程,而且Python的GIL(全局解释器锁)会限制CPU密集型任务的并行效率,过多线程反而会增加调度开销。比如改成10~100个线程。
  • 修改load函数避免内存爆炸:如果只是测试线程启动耗时,不需要生成超大列表,比如改成:
    def load():
        # 用循环代替生成超大列表,减少内存占用
        total = 0
        for i in range(1000000000):
            total += i
        print(total)
    
  • 使用线程池管理线程:借助concurrent.futures.ThreadPoolExecutor来自动控制线程数量,避免手动创建线程的资源浪费:
    from concurrent.futures import ThreadPoolExecutor
    
    def load():
        total = 0
        for i in range(1000000000):
            total += i
        print(total)
    
    def init_threads(numThreads):
        print('Starting thread init function')
        with ThreadPoolExecutor(max_workers=numThreads) as executor:
            for i in range(numThreads):
                executor.submit(load)
    
    init_threads(10)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:15:22