Flask并发测试耗时不符预期、sleep阻塞性及GIL限制相关问题
问题成因解答
1 总耗时仅2秒的核心原因
- 你使用的Werkzeug 2.0.1开发服务器,默认开启多线程处理模式,且默认线程池容量为5。10个并发请求会分为两批调度执行,每批分配5个线程同时处理。
- GIL并不会在所有场景下强制线程串行执行:当代码执行IO阻塞类操作时,Python解释器会主动释放GIL,允许其他线程获得执行权限。你的接口逻辑里的
sleep(1)属于典型的IO阻塞操作,10个线程的sleep过程可以并行等待,不会互相占用GIL。
两批请求每批的sleep等待耗时都是1秒,加上服务调度、请求处理的微小开销,总耗时刚好在2秒左右,和你测试得到的2.021秒完全吻合。
2 关联疑问解答
2.1 sleep()是否属于阻塞调用?
是,time.sleep()属于线程级别的阻塞系统调用。调用后当前线程会被操作系统内核挂起,在设置的休眠时长内不会获得CPU时间片,直到休眠计时结束才会回到就绪队列等待调度。
2.2 未使用asyncio,调用sleep()时为何会让出控制权?
控制权让出不依赖asyncio的异步调度能力,这是操作系统线程级调度的原生特性:
调用time.sleep()会触发内核态的系统调用,操作系统会直接将当前线程挂起,主动把CPU资源调度给其他处于就绪状态的线程执行。这个过程中Python解释器会自动释放当前线程持有的GIL,不需要异步框架的参与就能实现线程间的切换。
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

