news 2026/6/13 7:44:55

Python多线程入门:从零到能用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python多线程入门:从零到能用

为什么需要多线程?

单线程程序一次只能做一件事。如果你的程序里有网络请求、文件IO、数据库查询这类"等结果"的操作,CPU其实在空转。

多线程的核心目的:让CPU在等待的时候,去干别的事。


先搞懂两个概念

概念说明
进程独立的程序,内存隔离,开销大
线程进程内部的执行单元,共享内存,开销小
GILPython的全局解释器锁,同一时刻只有一个线程在执行Python代码

⚠️关键结论:Python多线程适合IO密集型任务,不适合CPU密集型任务。

  • ✅ 网络请求、文件读写、数据库查询 → 多线程有用
  • ❌ 纯计算、图像处理 → 多线程没用(GIL限制),用多进程

最基础的用法

importthreadingimporttimedeftask(name,delay):print(f"{name}开始")time.sleep(delay)print(f"{name}结束")# 创建线程t1=threading.Thread(target=task,args=("任务A",2))t2=threading.Thread(target=task,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=[]lock=threading.Lock()# 保护共享数据deffetch(url):resp=requests.get(url,timeout=5)withlock:# 加锁,避免多个线程同时写列表results.append(resp.status_code)threads=[]forurlinurls:t=threading.Thread(target=fetch,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_workers=5)asexecutor:results=list(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

什么时候用多线程?一张表说清

场景推荐方案
请求多个APIThreadPoolExecutor
读写多个文件✅ 多线程
爬虫✅ 多线程
大量数学计算❌ 用multiprocessing
简单脚本,任务少❌ 没必要,单线程就够

一句话总结

Python多线程 = 让IO等待的时间不被浪费。记住GIL的存在,别用它做计算,它就很好用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 7:43:53

语义分块:RAG效果跃升的核心技术突破

1. 项目概述:为什么语义分块正在取代传统切片,成为RAG落地的关键胜负手 “Unlocking the Advantages of Semantic Chunking to Supercharge Your RAG Models”——这个标题里藏着当前RAG工程中最真实、最紧迫的一次技术跃迁。我从2022年第一批用LangChai…

作者头像 李华
网站建设 2026/6/13 7:43:52

15分钟搞定Arduino ESP32开发:新手终极完整指南

15分钟搞定Arduino ESP32开发:新手终极完整指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 你是否对物联网开发充满好奇,却不知道如何开始&…

作者头像 李华
网站建设 2026/6/13 7:41:52

计算机毕业设计之医疗机构电子化注册信息系统设计与实现

摘要随着信息技术的飞速发展和医疗改革的深入推进,医疗机构对信息化管理的需求日益迫切,传统的医疗机构注册流程繁琐、耗时,且容易出错,已无法满足现代医疗服务的高效、准确需求,因此,医疗机构电子化注册信…

作者头像 李华
网站建设 2026/6/13 7:38:51

魔百盒M301H-MQ刷机后必做的5项优化:从‘能用’到‘好用’的进阶指南

魔百盒M301H-MQ刷机后必做的5项优化:从‘能用’到‘好用’的进阶指南当你成功将魔百盒M301H-MQ刷入第三方固件后,那种焕然一新的感觉确实令人兴奋。但真正的挑战才刚刚开始——如何让这台搭载Hi3798MV310芯片的老设备发挥出最大潜力?本文将带…

作者头像 李华