标准答案
- 在默认带 GIL 的 CPython 构建中,多个线程不能同时执行 Python 字节码,但线程仍能在 I/O 等待时交替工作;free-threaded 构建需要单独评估扩展兼容和锁成本。
- 多进程提供独立解释器和内存,能利用多核但有进程间通信和内存成本。
- asyncio 通过协作式事件循环处理非阻塞 I/O,阻塞调用仍会卡住事件循环。
- 最终并发度还受数据库连接、文件描述符、内存和下游容量限制。
题目解析
在默认带 GIL 的 CPython 构建中,多个线程不能同时执行 Python 字节码,但线程在 I/O 等待时仍能交替工作;多进程提供独立解释器,asyncio 则依赖协作式非阻塞调用。
并发、并行和 I/O 等待是不同维度。CPU 密集 Python 代码通常需要多进程或释放 GIL 的原生扩展,I/O 服务可以使用线程或 asyncio,但同步依赖会卡住事件循环。
最终容量还受连接、内存、文件描述符和下游配额约束。选择模型要从任务生命周期、取消、故障隔离和数据共享成本一起判断。
常见误区
- 误区:所有任务都改成多线程。改正:按 CPU/I/O、GIL、库行为和故障边界选择线程、进程或协程。
- 误区:在 asyncio 中直接调用阻塞库。改正:使用异步客户端或有界 executor 隔离阻塞。
- 误区:多进程数量超过 CPU 和下游容量。改正:按核心、内存、连接池和实例总预算设置 worker。