为何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
相关产品推荐
相关产品推荐

