Ubuntu Python并发编程模型
导读:Ubuntu 上的 Python 并发编程模型与选型 一 概览与选型 多线程 threading:共享内存、创建切换开销小;受 GIL 影响,CPU 密集型难以线性提速,但在 I/O 密集型(网络、磁盘、数据库)场景可有效提升吞吐。适合轻...
Ubuntu 上的 Python 并发编程模型与选型
一 概览与选型
- 多线程 threading:共享内存、创建切换开销小;受 GIL 影响,CPU 密集型难以线性提速,但在 I/O 密集型(网络、磁盘、数据库)场景可有效提升吞吐。适合轻量并发与高并发 I/O。
- 多进程 multiprocessing:每个进程有独立解释器与内存空间,可真正并行利用多核,适合 CPU 密集型;代价是进程创建/通信开销更大。
- 异步 asyncio:单线程事件循环 + 协程,基于 async/await,在大量 I/O 场景下高并发、低开销;需使用支持异步的库(如 aiohttp)。
- 协程库 gevent:基于 greenlet 的协作式并发,通过 monkey.patch_all() 将阻塞调用变为协作式切换,适合高并发网络 I/O。
- 线程/进程池 concurrent.futures:高层接口,便于快速在 ThreadPoolExecutor / ProcessPoolExecutor 间切换,结合 Future 获取结果。
- 选型要点:任务以 I/O 为主优先选 asyncio/gevent/多线程;以 CPU 为主优先选 多进程;不确定时先用 ProcessPoolExecutor 做基线测试。
二 快速上手示例
-
多线程
import threading def worker(i): print(f"Thread-{ i} running") threads = [threading.Thread(target=worker, args=(i,)) for i in range(3)] for t in threads: t.start() for t in threads: t.join() -
多进程
import multiprocessing as mp def worker(i): print(f"Process-{ i} running") procs = [mp.Process(target=worker, args=(i,)) for i in range(3)] for p in procs: p.start() for p in procs: p.join() -
异步 asyncio
import asyncio async def worker(i): print(f"Worker-{ i} start") await asyncio.sleep(1) print(f"Worker-{ i} done") async def main(): await asyncio.gather(*(worker(i) for i in range(3))) asyncio.run(main()) -
协程库 gevent
import gevent from gevent import monkey; monkey.patch_all() def worker(i): print(f"Greenlet-{ i} running") gevent.sleep(1) print(f"Greenlet-{ i} done") jobs = [gevent.spawn(worker, i) for i in range(3)] gevent.joinall(jobs) -
线程/进程池 concurrent.futures
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor def task(x): return x * x # 线程池 with ThreadPoolExecutor(max_workers=4) as ex: print(ex.map(task, range(5))) # 进程池 with ProcessPoolExecutor(max_workers=4) as ex: print(ex.map(task, range(5)))
以上示例均为 Ubuntu 可直接运行的 Python 3 代码范式。
三 模型对比与适用场景
| 模型 | 并发单元 | 并行度与 GIL | 典型场景 | 主要优点 | 主要注意点 |
|---|---|---|---|---|---|
| threading | 线程 | 受 GIL 影响,CPU 密集难并行;I/O 并发有效 | 高并发 I/O、轻量任务 | 共享内存、开销小 | 需同步原语;CPU 密集不占优 |
| multiprocessing | 进程 | 多进程可并行利用多核 | CPU 密集、大任务 | 真正并行、隔离性好 | 进程/通信开销大、内存占用高 |
| asyncio | 协程 | 单线程事件循环,非并行 | 大量 I/O、网络爬虫、微服务 | 高并发、低开销 | 全栈需异步;阻塞调用需适配 |
| gevent | greenlet | 协作式并发,非并行 | 高并发网络 I/O | 编程简单、生态成熟 | 需 monkey.patch_all();调试复杂度 |
| concurrent.futures | 线程/进程池 | 依后端而定 | 快速并行化既有函数 | 接口统一、易迁移 | 结果/超时/回调需合理设计 |
说明:GIL 使同一时刻仅有一个线程执行 Python 字节码,故多线程在 CPU 密集场景难以提速;而在 I/O 密集场景,线程在等待 I/O 时会释放 GIL,从而提升总体吞吐。
四 实践建议
- 明确瓶颈:用 time/perf 与 cProfile 判断是 CPU 还是 I/O 限制,再选模型。
- 线程安全:共享数据需使用 threading.Lock/RLock/Condition/Semaphore 等同步原语,避免竞态与死锁。
- 进程通信:优先使用 Queue/Pipe/共享内存;大数据量注意序列化与拷贝成本。
- 异步适配:确保网络/数据库等库支持 async/await(如 aiohttp);避免阻塞调用。
- 池化与背压:为线程/进程池设置合理的 max_workers,结合 生产者-消费者 与 信号量/队列 控制背压。
- 资源清理:正确 join()/close()/shutdown(),释放文件句柄与连接,防止泄漏。
- 监控与调优:结合 日志/指标 观察吞吐、延迟与错误率,逐步调参(并发度、批大小、超时)。
五 在 Ubuntu 上的运行与安装要点
- 环境准备:Ubuntu 通常预装 Python 3,可用
python3 --version检查;如需安装:sudo apt update & & sudo apt install python3 python3-pip。 - 第三方库:如 gevent/aiohttp,使用
pip3 install gevent aiohttp安装。 - 运行脚本:
python3 your_script.py;异步示例需 Python 3.7+ 使用asyncio.run(),旧版本可用事件循环 API。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu Python并发编程模型
本文地址: https://pptw.com/jishu/753419.html
