作者: andylin02
学习章节: 第7章 – 并发与并行
关键词: 线程, 子进程, 协程, GIL, asyncio, concurrent.futures, Queue, 死锁, 数据竞争
第7章思维导图:8条建议全景
#mermaid-svg-4vFMj63yWgxMdMCk{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4vFMj63yWgxMdMCk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4vFMj63yWgxMdMCk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4vFMj63yWgxMdMCk .error-icon{fill:#552222;}#mermaid-svg-4vFMj63yWgxMdMCk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4vFMj63yWgxMdMCk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4vFMj63yWgxMdMCk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4vFMj63yWgxMdMCk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4vFMj63yWgxMdMCk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4vFMj63yWgxMdMCk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4vFMj63yWgxMdMCk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4vFMj63yWgxMdMCk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4vFMj63yWgxMdMCk .marker.cross{stroke:#333333;}#mermaid-svg-4vFMj63yWgxMdMCk svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4vFMj63yWgxMdMCk p{margin:0;}#mermaid-svg-4vFMj63yWgxMdMCk .edge{stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .section–1 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section–1 path,#mermaid-svg-4vFMj63yWgxMdMCk .section–1 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section–1 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section–1 text{fill:#ffffff;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth–1{stroke-width:17;}#mermaid-svg-4vFMj63yWgxMdMCk .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-0 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-0 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-0 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-0 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-0 text{fill:black;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-0{font-size:40px;color:black;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-0{stroke-width:14;}#mermaid-svg-4vFMj63yWgxMdMCk .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-1 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-1 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-1 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-1 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-1 text{fill:black;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-1{font-size:40px;color:black;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-1{stroke-width:11;}#mermaid-svg-4vFMj63yWgxMdMCk .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-2 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-2 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-2 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-2 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-2 text{fill:#ffffff;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-2{stroke-width:8;}#mermaid-svg-4vFMj63yWgxMdMCk .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-3 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-3 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-3 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-3 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-3 text{fill:black;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-3{font-size:40px;color:black;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-3{stroke-width:5;}#mermaid-svg-4vFMj63yWgxMdMCk .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-4 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-4 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-4 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-4 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-4 text{fill:black;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-4{font-size:40px;color:black;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-4{stroke-width:2;}#mermaid-svg-4vFMj63yWgxMdMCk .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-5 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-5 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-5 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-5 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-5 text{fill:black;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-5{font-size:40px;color:black;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-5{stroke-width:-1;}#mermaid-svg-4vFMj63yWgxMdMCk .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-6 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-6 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-6 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-6 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-6 text{fill:black;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-6{font-size:40px;color:black;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-6{stroke-width:-4;}#mermaid-svg-4vFMj63yWgxMdMCk .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-7 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-7 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-7 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-7 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-7 text{fill:black;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-7{font-size:40px;color:black;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-7{stroke-width:-7;}#mermaid-svg-4vFMj63yWgxMdMCk .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-8 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-8 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-8 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-8 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-8 text{fill:black;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-8{font-size:40px;color:black;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-8{stroke-width:-10;}#mermaid-svg-4vFMj63yWgxMdMCk .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-9 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-9 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-9 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-9 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-9 text{fill:black;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-9{font-size:40px;color:black;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-9{stroke-width:-13;}#mermaid-svg-4vFMj63yWgxMdMCk .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-10 rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-10 path,#mermaid-svg-4vFMj63yWgxMdMCk .section-10 circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-10 polygon,#mermaid-svg-4vFMj63yWgxMdMCk .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-10 text{fill:black;}#mermaid-svg-4vFMj63yWgxMdMCk .node-icon-10{font-size:40px;color:black;}#mermaid-svg-4vFMj63yWgxMdMCk .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .edge-depth-10{stroke-width:-16;}#mermaid-svg-4vFMj63yWgxMdMCk .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled,#mermaid-svg-4vFMj63yWgxMdMCk .disabled circle,#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:lightgray;}#mermaid-svg-4vFMj63yWgxMdMCk .disabled text{fill:#efefef;}#mermaid-svg-4vFMj63yWgxMdMCk .section-root rect,#mermaid-svg-4vFMj63yWgxMdMCk .section-root path,#mermaid-svg-4vFMj63yWgxMdMCk .section-root circle,#mermaid-svg-4vFMj63yWgxMdMCk .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-4vFMj63yWgxMdMCk .section-root text{fill:#ffffff;}#mermaid-svg-4vFMj63yWgxMdMCk .section-root span{color:#ffffff;}#mermaid-svg-4vFMj63yWgxMdMCk .section-2 span{color:#ffffff;}#mermaid-svg-4vFMj63yWgxMdMCk .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-4vFMj63yWgxMdMCk .edge{fill:none;}#mermaid-svg-4vFMj63yWgxMdMCk .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-4vFMj63yWgxMdMCk :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
第7章 并发与并行 8条建议
并发模型
第52条: 线程 vs 子进程 vs 协程
第53条: threading与GIL
第54条: multiprocessing
第55条: asyncio协程
协作与安全
第56条: Queue协调线程
第57条: 使用concurrent.futures
第58条: 避免数据竞争
第59条: 避免死锁
第7章详细笔记:逐条精讲与源代码
本章直面 Python 并发编程的挑战,帮你理清三种并发模型(线程、进程、协程)的适用场景与最佳实践,并教你如何安全地协调并发任务,避免常见陷阱。
第52条:明白线程、子进程与协程的区别
核心:Python 提供三种主要的并发方式,各有适用场景:
| 线程 (threading) | I/O 密集型任务(网络、文件读写) | 受 GIL 限制,CPU 密集型任务无法真正并行 |
| 子进程 (multiprocessing) | CPU 密集型任务(计算、图像处理) | 进程间通信开销大,内存占用高 |
| 协程 (asyncio) | 大量并发 I/O,高并发网络服务 | 需要异步库支持,不能直接调用阻塞函数 |
# 示意:不同场景选择不同模型
# I/O 密集:线程或协程
# CPU 密集:多进程
# 高并发网络:协程
算法选择:GIL(全局解释器锁)导致 Python 多线程无法同时运行 Python 字节码,只允许一个线程执行,所以纯 Python 计算无法利用多核。
第53条:使用 threading 处理阻塞式 I/O,但避开 GIL 限制
核心:当任务是 I/O 密集型(如读写文件、网络请求),GIL 会在 I/O 阻塞时释放,多线程能提高吞吐量。但对于 CPU 密集型,GIL 会让多线程比单线程还慢(上下文切换开销)。
import threading
import time
def io_task(seconds):
"""模拟 I/O 阻塞"""
time.sleep(seconds)
print(f"{threading.current_thread().name} 完成")
# I/O 密集型:多线程有效加速
start = time.time()
threads = []
for i in range(5):
t = threading.Thread(target=io_task, args=(0.5,))
threads.append(t)
t.start()
for t in threads:
t.join()
print(f"多线程 I/O 耗时: {time.time() – start:.2f}s") # 约 0.5s,说明并行
GIL 图解:
#mermaid-svg-ZuUvc3I25gZGJXaG{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZuUvc3I25gZGJXaG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZuUvc3I25gZGJXaG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZuUvc3I25gZGJXaG .error-icon{fill:#552222;}#mermaid-svg-ZuUvc3I25gZGJXaG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZuUvc3I25gZGJXaG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZuUvc3I25gZGJXaG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZuUvc3I25gZGJXaG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZuUvc3I25gZGJXaG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZuUvc3I25gZGJXaG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZuUvc3I25gZGJXaG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZuUvc3I25gZGJXaG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZuUvc3I25gZGJXaG .marker.cross{stroke:#333333;}#mermaid-svg-ZuUvc3I25gZGJXaG svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZuUvc3I25gZGJXaG p{margin:0;}#mermaid-svg-ZuUvc3I25gZGJXaG .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZuUvc3I25gZGJXaG .cluster-label text{fill:#333;}#mermaid-svg-ZuUvc3I25gZGJXaG .cluster-label span{color:#333;}#mermaid-svg-ZuUvc3I25gZGJXaG .cluster-label span p{background-color:transparent;}#mermaid-svg-ZuUvc3I25gZGJXaG .label text,#mermaid-svg-ZuUvc3I25gZGJXaG span{fill:#333;color:#333;}#mermaid-svg-ZuUvc3I25gZGJXaG .node rect,#mermaid-svg-ZuUvc3I25gZGJXaG .node circle,#mermaid-svg-ZuUvc3I25gZGJXaG .node ellipse,#mermaid-svg-ZuUvc3I25gZGJXaG .node polygon,#mermaid-svg-ZuUvc3I25gZGJXaG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZuUvc3I25gZGJXaG .rough-node .label text,#mermaid-svg-ZuUvc3I25gZGJXaG .node .label text,#mermaid-svg-ZuUvc3I25gZGJXaG .image-shape .label,#mermaid-svg-ZuUvc3I25gZGJXaG .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZuUvc3I25gZGJXaG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZuUvc3I25gZGJXaG .rough-node .label,#mermaid-svg-ZuUvc3I25gZGJXaG .node .label,#mermaid-svg-ZuUvc3I25gZGJXaG .image-shape .label,#mermaid-svg-ZuUvc3I25gZGJXaG .icon-shape .label{text-align:center;}#mermaid-svg-ZuUvc3I25gZGJXaG .node.clickable{cursor:pointer;}#mermaid-svg-ZuUvc3I25gZGJXaG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZuUvc3I25gZGJXaG .arrowheadPath{fill:#333333;}#mermaid-svg-ZuUvc3I25gZGJXaG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZuUvc3I25gZGJXaG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZuUvc3I25gZGJXaG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZuUvc3I25gZGJXaG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZuUvc3I25gZGJXaG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZuUvc3I25gZGJXaG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZuUvc3I25gZGJXaG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZuUvc3I25gZGJXaG .cluster text{fill:#333;}#mermaid-svg-ZuUvc3I25gZGJXaG .cluster span{color:#333;}#mermaid-svg-ZuUvc3I25gZGJXaG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZuUvc3I25gZGJXaG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZuUvc3I25gZGJXaG rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZuUvc3I25gZGJXaG .icon-shape,#mermaid-svg-ZuUvc3I25gZGJXaG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZuUvc3I25gZGJXaG .icon-shape p,#mermaid-svg-ZuUvc3I25gZGJXaG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZuUvc3I25gZGJXaG .icon-shape .label rect,#mermaid-svg-ZuUvc3I25gZGJXaG .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZuUvc3I25gZGJXaG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZuUvc3I25gZGJXaG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZuUvc3I25gZGJXaG :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
线程1
获得GIL
线程2
等待GIL
执行一段字节码
释放GIL
线程2获得GIL
执行字节码
释放GIL
关键收获:多线程处理 I/O 密集任务效果好;CPU 密集任务应使用多进程或 C 扩展。
第54条:使用 multiprocessing 绕过 GIL,实现真正并行
核心:multiprocessing 模块启动独立的 Python 解释器进程,每个进程拥有自己的 GIL,因此可以同时利用多核 CPU。代价是进程间通信(IPC)比线程间共享内存更重。
import multiprocessing
import time
def cpu_intensive(n):
total = 0
for i in range(10**7):
total += i
return total
start = time.time()
with multiprocessing.Pool(processes=4) as pool:
results = pool.map(cpu_intensive, range(4))
print(f"多进程耗时: {time.time() – start:.2f}s")
数据共享:子进程间数据不共享,需使用 multiprocessing.Queue、Pipe 或 Value/Array(共享内存)。
关键收获:CPU 密集计算必须用多进程才能利用多核;务必在 if __name__ == '__main__': 下启动进程,以避免递归创建。
第55条:使用 asyncio 编写高并发 I/O 程序
核心:协程(async def/await)在单线程内通过事件循环实现并发,可以轻松管理成千上万个网络连接,没有线程切换开销,且没有 GIL 竞争。但所有 I/O 操作必须使用异步库(如 aiohttp)。
import asyncio
async def fetch_data(url):
print(f"开始请求 {url}")
await asyncio.sleep(1) # 模拟异步 I/O
print(f"完成 {url}")
return f"数据来自 {url}"
async def main():
urls = ['url1', 'url2', 'url3']
tasks = [fetch_data(url) for url in urls]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
协程规则:
- 定义:async def
- 调用异步函数:await
- 运行入口:asyncio.run()
- 并发运行多个协程:asyncio.gather() 或 asyncio.create_task()
关键收获:协程是处理大量并发 I/O 的最佳选择,但需要整条调用链都是异步的,否则阻塞会拖慢整个事件循环。
第56条:使用 Queue 协调线程之间的工作
核心:多线程之间共享数据时,必须防止数据竞争。使用 queue.Queue 可以安全地在线程间传递数据,它内部已经实现了所有必要的锁。
import threading
from queue import Queue
def producer(q, data):
for item in data:
q.put(item)
q.put(None) # 结束信号
def consumer(q):
while True:
item = q.get()
if item is None:
break
print(f"处理 {item}")
q = Queue()
t1 = threading.Thread(target=producer, args=(q, [1,2,3]))
t2 = threading.Thread(target=consumer, args=(q,))
t1.start(); t2.start()
t1.join(); t2.join()
流水线架构:Queue 可以串联多个工作阶段,形成生产者-消费者流水线。
#mermaid-svg-exSC3iGHhhOx969L{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-exSC3iGHhhOx969L .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-exSC3iGHhhOx969L .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-exSC3iGHhhOx969L .error-icon{fill:#552222;}#mermaid-svg-exSC3iGHhhOx969L .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-exSC3iGHhhOx969L .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-exSC3iGHhhOx969L .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-exSC3iGHhhOx969L .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-exSC3iGHhhOx969L .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-exSC3iGHhhOx969L .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-exSC3iGHhhOx969L .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-exSC3iGHhhOx969L .marker{fill:#333333;stroke:#333333;}#mermaid-svg-exSC3iGHhhOx969L .marker.cross{stroke:#333333;}#mermaid-svg-exSC3iGHhhOx969L svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-exSC3iGHhhOx969L p{margin:0;}#mermaid-svg-exSC3iGHhhOx969L .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-exSC3iGHhhOx969L .cluster-label text{fill:#333;}#mermaid-svg-exSC3iGHhhOx969L .cluster-label span{color:#333;}#mermaid-svg-exSC3iGHhhOx969L .cluster-label span p{background-color:transparent;}#mermaid-svg-exSC3iGHhhOx969L .label text,#mermaid-svg-exSC3iGHhhOx969L span{fill:#333;color:#333;}#mermaid-svg-exSC3iGHhhOx969L .node rect,#mermaid-svg-exSC3iGHhhOx969L .node circle,#mermaid-svg-exSC3iGHhhOx969L .node ellipse,#mermaid-svg-exSC3iGHhhOx969L .node polygon,#mermaid-svg-exSC3iGHhhOx969L .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-exSC3iGHhhOx969L .rough-node .label text,#mermaid-svg-exSC3iGHhhOx969L .node .label text,#mermaid-svg-exSC3iGHhhOx969L .image-shape .label,#mermaid-svg-exSC3iGHhhOx969L .icon-shape .label{text-anchor:middle;}#mermaid-svg-exSC3iGHhhOx969L .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-exSC3iGHhhOx969L .rough-node .label,#mermaid-svg-exSC3iGHhhOx969L .node .label,#mermaid-svg-exSC3iGHhhOx969L .image-shape .label,#mermaid-svg-exSC3iGHhhOx969L .icon-shape .label{text-align:center;}#mermaid-svg-exSC3iGHhhOx969L .node.clickable{cursor:pointer;}#mermaid-svg-exSC3iGHhhOx969L .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-exSC3iGHhhOx969L .arrowheadPath{fill:#333333;}#mermaid-svg-exSC3iGHhhOx969L .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-exSC3iGHhhOx969L .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-exSC3iGHhhOx969L .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-exSC3iGHhhOx969L .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-exSC3iGHhhOx969L .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-exSC3iGHhhOx969L .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-exSC3iGHhhOx969L .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-exSC3iGHhhOx969L .cluster text{fill:#333;}#mermaid-svg-exSC3iGHhhOx969L .cluster span{color:#333;}#mermaid-svg-exSC3iGHhhOx969L div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-exSC3iGHhhOx969L .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-exSC3iGHhhOx969L rect.text{fill:none;stroke-width:0;}#mermaid-svg-exSC3iGHhhOx969L .icon-shape,#mermaid-svg-exSC3iGHhhOx969L .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-exSC3iGHhhOx969L .icon-shape p,#mermaid-svg-exSC3iGHhhOx969L .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-exSC3iGHhhOx969L .icon-shape .label rect,#mermaid-svg-exSC3iGHhhOx969L .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-exSC3iGHhhOx969L .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-exSC3iGHhhOx969L .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-exSC3iGHhhOx969L :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
put
get
get
put
put
get
生产者线程
Queue
消费者线程1
消费者线程2
下一个Queue
后续处理线程
关键收获:用 Queue 解耦线程,避免显式锁,大大降低并发编程复杂度。
第57条:使用 concurrent.futures 简化并发执行
核心:concurrent.futures 提供了 ThreadPoolExecutor 和 ProcessPoolExecutor,统一了线程和进程的并发接口。使用 submit 或 map 可以轻松提交任务并获取结果。
from concurrent.futures import ThreadPoolExecutor, as_completed
def download(url):
# 模拟下载
import time, random
time.sleep(random.random())
return f"{url} 内容"
urls = ['a.com', 'b.com', 'c.com']
with ThreadPoolExecutor(max_workers=3) as executor:
# 方式1: 使用 map,保持顺序
results = executor.map(download, urls)
print(list(results))
# 方式2: 使用 submit + as_completed,先完成的先处理
future_to_url = {executor.submit(download, url): url for url in urls}
for future in as_completed(future_to_url):
url = future_to_url[future]
print(f"{url} 完成: {future.result()}")
关键收获:concurrent.futures 屏蔽了底层并发模型的差异,让你轻松从线程切换到进程,同时提供灵活的结果处理。
第58条:避免竞态条件
核心:多线程/多进程同时读写共享数据时,由于执行顺序不确定,会导致不可重现的错误,即数据竞争。必须使用锁(Lock)或原子操作来保护临界区。
import threading
# ❌ 没有锁:结果不确定
counter = 0
def increment_bad():
global counter
for _ in range(100000):
counter += 1
# ✅ 使用 Lock 保护
lock = threading.Lock()
def increment_good():
global counter
for _ in range(100000):
with lock:
counter += 1
threads = [threading.Thread(target=increment_good) for _ in range(5)]
for t in threads: t.start()
for t in threads: t.join()
print(counter) # 正确输出 500000
临界区示意图:
#mermaid-svg-PDNG3DHsUTd6LNUt{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PDNG3DHsUTd6LNUt .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PDNG3DHsUTd6LNUt .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PDNG3DHsUTd6LNUt .error-icon{fill:#552222;}#mermaid-svg-PDNG3DHsUTd6LNUt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PDNG3DHsUTd6LNUt .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PDNG3DHsUTd6LNUt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PDNG3DHsUTd6LNUt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PDNG3DHsUTd6LNUt .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PDNG3DHsUTd6LNUt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PDNG3DHsUTd6LNUt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PDNG3DHsUTd6LNUt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PDNG3DHsUTd6LNUt .marker.cross{stroke:#333333;}#mermaid-svg-PDNG3DHsUTd6LNUt svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PDNG3DHsUTd6LNUt p{margin:0;}#mermaid-svg-PDNG3DHsUTd6LNUt .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-PDNG3DHsUTd6LNUt .cluster-label text{fill:#333;}#mermaid-svg-PDNG3DHsUTd6LNUt .cluster-label span{color:#333;}#mermaid-svg-PDNG3DHsUTd6LNUt .cluster-label span p{background-color:transparent;}#mermaid-svg-PDNG3DHsUTd6LNUt .label text,#mermaid-svg-PDNG3DHsUTd6LNUt span{fill:#333;color:#333;}#mermaid-svg-PDNG3DHsUTd6LNUt .node rect,#mermaid-svg-PDNG3DHsUTd6LNUt .node circle,#mermaid-svg-PDNG3DHsUTd6LNUt .node ellipse,#mermaid-svg-PDNG3DHsUTd6LNUt .node polygon,#mermaid-svg-PDNG3DHsUTd6LNUt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PDNG3DHsUTd6LNUt .rough-node .label text,#mermaid-svg-PDNG3DHsUTd6LNUt .node .label text,#mermaid-svg-PDNG3DHsUTd6LNUt .image-shape .label,#mermaid-svg-PDNG3DHsUTd6LNUt .icon-shape .label{text-anchor:middle;}#mermaid-svg-PDNG3DHsUTd6LNUt .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PDNG3DHsUTd6LNUt .rough-node .label,#mermaid-svg-PDNG3DHsUTd6LNUt .node .label,#mermaid-svg-PDNG3DHsUTd6LNUt .image-shape .label,#mermaid-svg-PDNG3DHsUTd6LNUt .icon-shape .label{text-align:center;}#mermaid-svg-PDNG3DHsUTd6LNUt .node.clickable{cursor:pointer;}#mermaid-svg-PDNG3DHsUTd6LNUt .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PDNG3DHsUTd6LNUt .arrowheadPath{fill:#333333;}#mermaid-svg-PDNG3DHsUTd6LNUt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PDNG3DHsUTd6LNUt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PDNG3DHsUTd6LNUt .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PDNG3DHsUTd6LNUt .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PDNG3DHsUTd6LNUt .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PDNG3DHsUTd6LNUt .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PDNG3DHsUTd6LNUt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PDNG3DHsUTd6LNUt .cluster text{fill:#333;}#mermaid-svg-PDNG3DHsUTd6LNUt .cluster span{color:#333;}#mermaid-svg-PDNG3DHsUTd6LNUt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PDNG3DHsUTd6LNUt .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PDNG3DHsUTd6LNUt rect.text{fill:none;stroke-width:0;}#mermaid-svg-PDNG3DHsUTd6LNUt .icon-shape,#mermaid-svg-PDNG3DHsUTd6LNUt .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PDNG3DHsUTd6LNUt .icon-shape p,#mermaid-svg-PDNG3DHsUTd6LNUt .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PDNG3DHsUTd6LNUt .icon-shape .label rect,#mermaid-svg-PDNG3DHsUTd6LNUt .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PDNG3DHsUTd6LNUt .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PDNG3DHsUTd6LNUt .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PDNG3DHsUTd6LNUt :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
线程1
尝试获取锁
线程2
锁已被占用,等待
获得锁,进入临界区
修改共享数据
释放锁
获得锁
修改共享数据
释放锁
关键收获:任何共享状态都必须用锁保护;尽量使用 Queue 或 concurrent.futures 传递数据,避免直接共享状态。
第59条:避免死锁
核心:当多个线程/进程互相等待对方持有的资源时,程序会永久卡住,这就是死锁。要避免死锁,最重要的是按固定顺序获取锁,或使用超时机制。
import threading
import time
lock_a = threading.Lock()
lock_b = threading.Lock()
# ❌ 死锁示例:两个线程以相反顺序获取锁
def bad_worker1():
with lock_a:
time.sleep(0.1)
with lock_b:
print("Worker1 完成")
def bad_worker2():
with lock_b: # 注意:先获取 lock_b
time.sleep(0.1)
with lock_a:
print("Worker2 完成")
# ✅ 避免死锁:始终按 lock_a -> lock_b 顺序获取
def good_worker1():
with lock_a:
with lock_b:
print("Good Worker1 完成")
def good_worker2():
with lock_a: # 即使只用一个,也先获取 a
with lock_b:
print("Good Worker2 完成")
避免死锁原则:
- 锁的获取顺序全局一致
- 尽量使用上下文管理器(with lock:)
- 使用 Queue 等高级通信机制,避免手动加锁
- 为锁设置超时(lock.acquire(timeout=5))
关键收获:死锁往往难以重现和调试,从设计层面就规划好锁的顺序,或者干脆不使用显式锁。
并发模型选择决策流程
#mermaid-svg-WA4anss4CPJGeXYC{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WA4anss4CPJGeXYC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WA4anss4CPJGeXYC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WA4anss4CPJGeXYC .error-icon{fill:#552222;}#mermaid-svg-WA4anss4CPJGeXYC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WA4anss4CPJGeXYC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WA4anss4CPJGeXYC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WA4anss4CPJGeXYC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WA4anss4CPJGeXYC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WA4anss4CPJGeXYC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WA4anss4CPJGeXYC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WA4anss4CPJGeXYC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WA4anss4CPJGeXYC .marker.cross{stroke:#333333;}#mermaid-svg-WA4anss4CPJGeXYC svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WA4anss4CPJGeXYC p{margin:0;}#mermaid-svg-WA4anss4CPJGeXYC .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-WA4anss4CPJGeXYC .cluster-label text{fill:#333;}#mermaid-svg-WA4anss4CPJGeXYC .cluster-label span{color:#333;}#mermaid-svg-WA4anss4CPJGeXYC .cluster-label span p{background-color:transparent;}#mermaid-svg-WA4anss4CPJGeXYC .label text,#mermaid-svg-WA4anss4CPJGeXYC span{fill:#333;color:#333;}#mermaid-svg-WA4anss4CPJGeXYC .node rect,#mermaid-svg-WA4anss4CPJGeXYC .node circle,#mermaid-svg-WA4anss4CPJGeXYC .node ellipse,#mermaid-svg-WA4anss4CPJGeXYC .node polygon,#mermaid-svg-WA4anss4CPJGeXYC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WA4anss4CPJGeXYC .rough-node .label text,#mermaid-svg-WA4anss4CPJGeXYC .node .label text,#mermaid-svg-WA4anss4CPJGeXYC .image-shape .label,#mermaid-svg-WA4anss4CPJGeXYC .icon-shape .label{text-anchor:middle;}#mermaid-svg-WA4anss4CPJGeXYC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WA4anss4CPJGeXYC .rough-node .label,#mermaid-svg-WA4anss4CPJGeXYC .node .label,#mermaid-svg-WA4anss4CPJGeXYC .image-shape .label,#mermaid-svg-WA4anss4CPJGeXYC .icon-shape .label{text-align:center;}#mermaid-svg-WA4anss4CPJGeXYC .node.clickable{cursor:pointer;}#mermaid-svg-WA4anss4CPJGeXYC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WA4anss4CPJGeXYC .arrowheadPath{fill:#333333;}#mermaid-svg-WA4anss4CPJGeXYC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WA4anss4CPJGeXYC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WA4anss4CPJGeXYC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WA4anss4CPJGeXYC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WA4anss4CPJGeXYC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WA4anss4CPJGeXYC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WA4anss4CPJGeXYC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WA4anss4CPJGeXYC .cluster text{fill:#333;}#mermaid-svg-WA4anss4CPJGeXYC .cluster span{color:#333;}#mermaid-svg-WA4anss4CPJGeXYC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WA4anss4CPJGeXYC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WA4anss4CPJGeXYC rect.text{fill:none;stroke-width:0;}#mermaid-svg-WA4anss4CPJGeXYC .icon-shape,#mermaid-svg-WA4anss4CPJGeXYC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WA4anss4CPJGeXYC .icon-shape p,#mermaid-svg-WA4anss4CPJGeXYC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WA4anss4CPJGeXYC .icon-shape .label rect,#mermaid-svg-WA4anss4CPJGeXYC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WA4anss4CPJGeXYC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WA4anss4CPJGeXYC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WA4anss4CPJGeXYC :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
I/O 密集型
几百~几千并发
几十并发且已有同步代码
CPU 密集型
是
否
是
需要并发执行
任务是 I/O 密集型还是 CPU 密集型?
并发数量?
使用 asyncio 协程
使用 threading 线程
使用 multiprocessing 子进程
需要协调线程?
需要传递数据?
使用 Queue 或 concurrent.futures
直接使用 Thread
使用 asyncio.Queue
使用 ProcessPoolExecutor
第7章总结:并发编程的攻守之道
掌握这些,你将能根据场景游刃有余地选择并发策略,写出高性能且稳健的并发程序。
下一章预告:第8章 – 稳定性与性能
并发让程序跑得快,但稳定性与性能让它跑得远。下一章你将学到:
- 如何优雅地处理异常和管理资源(try/except/finally、with)
- 性能分析工具的使用,定位真正的瓶颈
- 内存优化的秘技:__slots__、弱引用等
- 如何在性能和代码清晰之间做出明智的权衡
第8章将教你写出不仅正确高效,而且健壮持久的生产级代码!
本文为个人学习笔记,仅用于知识分享。如有错误,欢迎指正。
👍🏻 点赞 + 收藏 + 分享,让更多开发者看到这篇深度解析!❤️ 如果觉得有用,请给个赞支持一下作者!
