为什么Python多线程脚本执行结果与顺序处理一致而非真正并行?
多线程输出与顺序执行一致的核心原因
- 测试任务计算量远小于线程启动开销
当前测试用的Supplier_list数组元素都是个位数,每个线程内的循环次数最多仅20次,实际执行耗时为微秒级,远低于线程启动的毫秒级开销。你按列表顺序依次启动线程,第一个线程启动完成后,在后续线程完成启动流程前就已经执行完全部逻辑输出结果,最终呈现顺序执行的效果。你放开代码中注释的大数值Supplier_list,放大每个线程的执行时长,就能观测到乱序输出的多线程特性。 - CPython全局解释器锁(GIL)限制CPU密集型任务并行
你编写的线程函数属于纯CPU计算类任务,CPython解释器的GIL机制会保证同一时间只有一个线程执行Python字节码,CPU密集型场景下的多线程本质是时间片轮转的并发,而非真正的并行。如果单线程任务执行时长很短,GIL还没触发切换前线程就已经执行完毕,自然不会出现乱序输出。 - print函数内置线程锁的次要影响
Python的print函数默认是线程安全的,内部自带互斥锁保证同一时间只有一个线程向标准输出写内容,一定程度上也会强化顺序输出的表现。
实现真正并行效果的修改方案
- 针对CPU密集型任务,将
threading多线程替换为multiprocessing多进程,绕开GIL限制实现多核并行 - 测试时放大单任务的计算量,避免线程启动开销覆盖任务执行逻辑的效果
内容的提问来源于stack exchange,提问作者Nirav Prajapati
相关产品推荐
相关产品推荐

