1. 为什么我们需要并发编程?
当你的Python脚本需要同时处理多个任务时,比如一边下载文件一边解析数据,或者同时响应多个用户请求,单线程的局限性就暴露无遗。我十年前第一次用Python写网络爬虫时就遇到了这个问题——明明服务器带宽足够,但单线程下载几百个页面时速度慢得令人发指。
1.1 全局解释器锁(GIL)的桎梏
Python的GIL就像是一个严格的交通警察,它规定任何时候只有一个线程能够执行Python字节码。这意味着即使你有8核CPU,多线程程序在CPU密集型任务上也可能表现不佳。我在数据分析项目中实测过:用4个线程计算斐波那契数列,速度反而比单线程慢了15%,这就是GIL的"功劳"。
但别急着否定多线程,在I/O密集型场景下它依然大有用武之地。当线程在等待网络响应或磁盘读写时,GIL会被释放,其他线程就有机会执行。我的爬虫项目改用多线程后,下载效率提升了8倍。
1.2 进程与线程的本质区别
理解这个区别至关重要。线程像是同一条流水线上的工人,共享工作环境(内存空间);进程则是完全独立的工厂,有自己独立的内存。这种差异带来了完全不同的特性:
| 特性 | 线程 | 进程 |
|---|---|---|
| 创建开销 | 小(通常几MB) | 大(通常几十MB) |
| 通信方式 | 直接读写共享内存(需同步) | 必须通过IPC(管道、队列等) |
| 崩溃影响 | 可能导致整个程序崩溃 | 只影响自身 |
| Python适用场景 | I/O密集型、GUI应用 | CPU密集型、需要绕过GIL的任务 |
| 调试难度 | 较难(共享状态复杂) | 相对简单(隔离性好) |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
