为什么需要多线程单线程程序一次只能做一件事。如果你的程序里有网络请求、文件IO、数据库查询这类等结果的操作CPU其实在空转。多线程的核心目的让CPU在等待的时候去干别的事。先搞懂两个概念概念说明进程独立的程序内存隔离开销大线程进程内部的执行单元共享内存开销小GILPython的全局解释器锁同一时刻只有一个线程在执行Python代码⚠️关键结论Python多线程适合IO密集型任务不适合CPU密集型任务。✅ 网络请求、文件读写、数据库查询 → 多线程有用❌ 纯计算、图像处理 → 多线程没用GIL限制用多进程最基础的用法importthreadingimporttimedeftask(name,delay):print(f{name}开始)time.sleep(delay)print(f{name}结束)# 创建线程t1threading.Thread(targettask,args(任务A,2))t2threading.Thread(targettask,args(任务B,1))# 启动线程t1.start()t2.start()# 等待线程结束t1.join()t2.join()print(全部完成)输出任务A 开始 任务B 开始 任务B 结束 任务A 结束 全部完成两个任务同时在跑总耗时约2秒而不是3秒。实战并发请求接口这是最常见的使用场景importthreadingimportrequests urls[https://api.example.com/1,https://api.example.com/2,https://api.example.com/3,]results[]lockthreading.Lock()# 保护共享数据deffetch(url):resprequests.get(url,timeout5)withlock:# 加锁避免多个线程同时写列表results.append(resp.status_code)threads[]forurlinurls:tthreading.Thread(targetfetch,args(url,))t.start()threads.append(t)fortinthreads:t.join()print(f完成{len(results)}个请求)进阶用 ThreadPoolExecutor推荐手动管理线程太麻烦直接用线程池fromconcurrent.futuresimportThreadPoolExecutorimportrequests urls[url1,url2,url3,...]deffetch(url):returnrequests.get(url).status_codewithThreadPoolExecutor(max_workers5)asexecutor:resultslist(executor.map(fetch,urls))print(results)✅ 自动管理线程数量不用手动start/join✅max_workers控制并发数避免把对方服务器打挂三个常见坑坑说明解决方案GIL导致多线程不加速计算for i in range(10000000): pass开10个线程也不会变快CPU密集型用multiprocessing共享数据竞争多个线程同时改同一个变量结果不可预期用threading.Lock()加锁线程数开太多每个线程有开销开1000个线程反而更慢IO密集型线程数 CPU核数 × 2~5什么时候用多线程一张表说清场景推荐方案请求多个API✅ThreadPoolExecutor读写多个文件✅ 多线程爬虫✅ 多线程大量数学计算❌ 用multiprocessing简单脚本任务少❌ 没必要单线程就够一句话总结Python多线程 让IO等待的时间不被浪费。记住GIL的存在别用它做计算它就很好用。
Python多线程入门:从零到能用
发布时间:2026/6/13 7:45:11
为什么需要多线程单线程程序一次只能做一件事。如果你的程序里有网络请求、文件IO、数据库查询这类等结果的操作CPU其实在空转。多线程的核心目的让CPU在等待的时候去干别的事。先搞懂两个概念概念说明进程独立的程序内存隔离开销大线程进程内部的执行单元共享内存开销小GILPython的全局解释器锁同一时刻只有一个线程在执行Python代码⚠️关键结论Python多线程适合IO密集型任务不适合CPU密集型任务。✅ 网络请求、文件读写、数据库查询 → 多线程有用❌ 纯计算、图像处理 → 多线程没用GIL限制用多进程最基础的用法importthreadingimporttimedeftask(name,delay):print(f{name}开始)time.sleep(delay)print(f{name}结束)# 创建线程t1threading.Thread(targettask,args(任务A,2))t2threading.Thread(targettask,args(任务B,1))# 启动线程t1.start()t2.start()# 等待线程结束t1.join()t2.join()print(全部完成)输出任务A 开始 任务B 开始 任务B 结束 任务A 结束 全部完成两个任务同时在跑总耗时约2秒而不是3秒。实战并发请求接口这是最常见的使用场景importthreadingimportrequests urls[https://api.example.com/1,https://api.example.com/2,https://api.example.com/3,]results[]lockthreading.Lock()# 保护共享数据deffetch(url):resprequests.get(url,timeout5)withlock:# 加锁避免多个线程同时写列表results.append(resp.status_code)threads[]forurlinurls:tthreading.Thread(targetfetch,args(url,))t.start()threads.append(t)fortinthreads:t.join()print(f完成{len(results)}个请求)进阶用 ThreadPoolExecutor推荐手动管理线程太麻烦直接用线程池fromconcurrent.futuresimportThreadPoolExecutorimportrequests urls[url1,url2,url3,...]deffetch(url):returnrequests.get(url).status_codewithThreadPoolExecutor(max_workers5)asexecutor:resultslist(executor.map(fetch,urls))print(results)✅ 自动管理线程数量不用手动start/join✅max_workers控制并发数避免把对方服务器打挂三个常见坑坑说明解决方案GIL导致多线程不加速计算for i in range(10000000): pass开10个线程也不会变快CPU密集型用multiprocessing共享数据竞争多个线程同时改同一个变量结果不可预期用threading.Lock()加锁线程数开太多每个线程有开销开1000个线程反而更慢IO密集型线程数 CPU核数 × 2~5什么时候用多线程一张表说清场景推荐方案请求多个API✅ThreadPoolExecutor读写多个文件✅ 多线程爬虫✅ 多线程大量数学计算❌ 用multiprocessing简单脚本任务少❌ 没必要单线程就够一句话总结Python多线程 让IO等待的时间不被浪费。记住GIL的存在别用它做计算它就很好用。