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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:36:00