Python 多线程与多进程并发编程实战
Python 并发编程绕不开 GIL很多人被它坑过。这篇讲清多线程、多进程怎么选、怎么写附爬虫和 CPU 密集型两个实战例子。一、多线程IO 密集型用 threadimportthreadingimporttimedefdownload(url):print(f开始下载:{url})time.sleep(2)# 模拟网络请求IO等待print(f下载完成:{url})# 串行 6 秒# 多线程并发 2 秒starttime.time()threads[]foriinrange(3):tthreading.Thread(targetdownload,args(furl-{i},))t.start()threads.append(t)fortinthreads:t.join()# 等所有线程结束print(f耗时:{time.time()-start:.1f}秒)# 输出: 耗时约 2.0 秒线程池版本更推荐fromconcurrent.futuresimportThreadPoolExecutor urls[furl-{i}foriinrange(10)]withThreadPoolExecutor(max_workers5)aspool:# 提交任务返回 Futurefutures[pool.submit(download,url)forurlinurls]forfinfutures:f.result()# 阻塞等结果异常会在这里抛出二、GIL 是什么必考GIL 全局解释器锁 Python 同一时刻只有一个线程在执行 Python 字节码 → 多线程无法利用多核 CPU 为什么有 GIL CPython 内存管理引用计数不是线程安全的 加 GIL 最简单牺牲并行换安全 影响 多线程对 IO 密集型有效线程等待IO时释放GIL 多线程对 CPU 密集型无效只在一个核上跑验证 GIL# CPU 密集型任务多线程反而更慢defcompute(n):returnsum(i*iforiinrange(n))# 串行 vs 多线程CPU 密集型下多线程没有优势# 因为 GIL 让线程轮流占用 CPU还有切换开销三、多进程CPU 密集型用 ProcessfrommultiprocessingimportProcess,cpu_countimportosdefheavy_task(n):CPU 密集型大量计算result0foriinrange(n):resulti*iprint(f进程{os.getpid()}计算完成:{result})returnresultif__name____main__:processes[]foriinrange(cpu_count()):# 进程数 CPU核数pProcess(targetheavy_task,args(5_000_000,))p.start()processes.append(p)forpinprocesses:p.join()每个进程有独立的解释器和 GIL → 真正利用多核。但注意进程间不共享内存传数据用队列。四、进程池 队列传数据frommultiprocessingimportPool,Queueimportmultiprocessingdefworker(item):returnitem*itemdefmain():# 进程池自动管理多个进程withPool(4)aspool:resultspool.map(worker,range(10))print(results)# [0, 1, 4, 9, ...]# 进程间通信用 Queueqmultiprocessing.Queue()q.put(数据)print(q.get())if__name____main__:main()五、异步 asyncio更高的 IO 并发IO 密集还能用协程单线程也能上万并发importasyncioasyncdeffetch(url):print(f请求:{url})awaitasyncio.sleep(1)# 模拟IO协程挂起不占线程returnf数据:{url}asyncdefmain():tasks[fetch(furl-{i})foriinrange(5)]resultsawaitasyncio.gather(*tasks)print(results)asyncio.run(main())# 5个请求 1 秒完成并发单线程六、怎么选核心结论任务类型方案原因IO 密集型爬虫/请求/读写多线程 / asyncio等待IO时让出CPUGIL不影响CPU 密集型计算/压缩/加密多进程 ProcessPool绕开GIL真正用多核简单高并发IOasyncio 协程单线程上万并发资源占用最小# 推荐concurrent.futures 统一接口fromconcurrent.futuresimportProcessPoolExecutor,ThreadPoolExecutor# IO 密集 → 线程池withThreadPoolExecutor(max_workers10)aspool:...# CPU 密集 → 进程池withProcessPoolExecutor(max_workers4)aspool:...真实爬虫场景最佳实践importrequestsfromconcurrent.futuresimportThreadPoolExecutordefcrawl(url):resprequests.get(url,timeout5)returnlen(resp.content)urls[https://example.com/str(i)foriinrange(100)]withThreadPoolExecutor(max_workers20)aspool:# 20个并发请求sizeslist(pool.map(crawl,urls))print(f总下载量:{sum(sizes)}字节)# 100个请求从串行100秒 → 并发约5秒总结Python 并发选择一句话IO 密集用线程CPU 密集用进程超高并发用协程。多线程 threading → IO 等待时切线程适合爬虫 多进程 multiprocessing → 绕开 GIL适合计算 协程 asyncio → 单线程高并发最轻量记住 GIL 的坑CPU 密集别用多线程再配合concurrent.futures统一接口并发代码就能写得又快又稳。 觉得有用的话点赞 关注【张老师技术栈】吧

相关新闻

UML建模在在线购物系统开发中的应用与实践

UML建模在在线购物系统开发中的应用与实践

1. 为什么在线购物系统需要UML建模在开发一个在线购物系统时,UML(统一建模语言)就像建筑师的蓝图一样不可或缺。想象一下,你要建造一栋大楼,没有设计图纸就直接开工,结果会怎样?同样的道理&…

2026/10/18 22:46:15 阅读更多 →
VMware虚拟机共享目录配置:Linux挂载与权限问题解决指南

VMware虚拟机共享目录配置:Linux挂载与权限问题解决指南

1. 项目概述:为什么虚拟机需要共享目录?在虚拟化技术已经成为开发和运维基础设施标配的今天,VMware Workstation 或 VMware Player 这类桌面级虚拟化软件,是很多工程师、测试人员和学生在本地搭建多系统环境的首选工具。无论是为了…

2026/10/19 0:29:26 阅读更多 →
AI驱动测试:从TDD到智能测试的演进与实践

AI驱动测试:从TDD到智能测试的演进与实践

1. 测试理念的演变与现状 2003年Kent Beck在《Test-Driven Development》一书中首次系统化提出TDD(测试驱动开发)方法论时,可能不会想到20年后AI技术会给软件测试领域带来如此深刻的变革。作为从业15年的测试架构师,我亲历了从纯手…

2026/10/18 23:41:08 阅读更多 →

最新新闻

普朗克公式MATLAB实现:从热辐射原理到数值计算避坑指南

普朗克公式MATLAB实现:从热辐射原理到数值计算避坑指南

简介:这份资源面向从事红外仿真、物理模拟与科学计算的工程师及科研人员,聚焦如何用MATLAB实现普朗克公式的数值计算。普朗克公式是描述黑体辐射能量分布的基本定律,掌握其编程实现是红外仿真与辐射度分析的基础技能。资源包共5个文件&#x…

2026/10/20 5:09:59 阅读更多 →
Agent上下文管理五路线解析:从窗口瓶颈到记忆分层

Agent上下文管理五路线解析:从窗口瓶颈到记忆分层

做Agent的朋友最近应该都有同一种焦虑:上下文不够用了。单轮对话的任务还好,一旦进入多步规划、多工具调用、长对话连续执行,模型的输入窗口就成了瓶颈,而且这个瓶颈不只是“放不下”那么简单——放得下但不重要、放得下但太贵、放…

2026/10/20 5:09:59 阅读更多 →
AutoGen多智能体框架:工程化落地的开源底座

AutoGen多智能体框架:工程化落地的开源底座

1. 这不是又一个“AI Agent 框架”,而是让多智能体协作真正落地的工程化底座“微软 AutoGen:多智能体 AI 应用的开源框架”——这个标题里藏着三个被多数人忽略的关键定语:“微软”、“多智能体”、“工程化”。它不是在讲“怎么调用一个大模…

2026/10/20 5:09:59 阅读更多 →
基于YOLO的行人跌倒检测系统实战:数据、训练与部署优化

基于YOLO的行人跌倒检测系统实战:数据、训练与部署优化

最早接触行人跌倒检测,是帮朋友做一套家庭看护系统的原型。当时第一反应很简单:拿现成的目标检测模型,在视频流上框出人,再判断这个人是站着还是躺着,不就完了吗?真正跑起来才发现,这事和"…

2026/10/20 5:09:59 阅读更多 →
大模型量化部署全攻略:从显存优化到GPTQ/AWQ/GGUF实战

大模型量化部署全攻略:从显存优化到GPTQ/AWQ/GGUF实战

量化这事,做大模型部署的基本都绕不开。我去年底第一次想在本地把一个大模型跑起来的时候,一看权重文件动辄十几个GB,再看看手头显卡那点显存,瞬间理解了什么叫"看得见吃不着"。后来折腾了一遍量化,从4bit加…

2026/10/20 5:09:59 阅读更多 →
联想Y7000-I5装Ubuntu 22.04实战避坑指南

联想Y7000-I5装Ubuntu 22.04实战避坑指南

1. 项目概述:为什么一台游戏本装Linux需要专门写注意事项?“联想拯救者Y7000-I5装Ubuntu”这个标题背后,藏着的不是一句简单的“换系统”,而是一场硬件兼容性、驱动生态与用户预期之间的三方拉锯战。我从2018年起陆续帮二十多位朋…

2026/10/20 5:08:59 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →