Python(19)Python并发编程:深入解析多线程与多进程的差异及锁机制实战
目录
- 一、背景:Python并发编程的必要性
- 二、核心概念对比
- 2.1 技术特性对比表
- 2.2 性能测试对比(4核CPU)
- 三、线程与进程的创建实战
- 3.1 多线程基础模板
- 3.2 多进程进阶模板
- 四、锁机制深度解析
- 4.1 资源竞争问题重现
- 4.2 线程锁解决方案
- 4.3 进程锁的特殊处理
- 五、高级锁机制扩展
- 5.1 可重入锁(RLock)
- 5.2 信号量控制
- 六、最佳实践总结
- 1. 选择策略:
- 2. 锁使用原则:
- 3. 性能优化技巧:
- 4. 常见陷阱规避:
- Python相关文章(推荐)
一、背景:Python并发编程的必要性
并发编程是提升程序性能的关键技术,根据2023年PyPI官方统计,超过78%的Python项目涉及并发处理需求。Python受GIL(全局解释器锁)限制,选择正确的并发方案尤为重要:
- CPU密集型任务:图像处理/科学计算等(适合多进程)
- IO密集型任务:网络请求/文件读写等(适合多线程)
- 实时响应需求:GUI应用/游戏开发等
- 资源竞争管理:数据库操作/共享内存访问
二、核心概念对比
2.1 技术特性对比表
特性 | 多线程(Threading) | 多进程(Multiprocessing) |
---|---|---|
内存空间 | 共享内存 | 独立内存 |
创建开销 | 小(约1MB) | 大(约10MB) |
数据通信 | Queue/共享变量 | Pipe/Queue/共享内存 |
GIL影响 | 受限制 | 无限制 |
适用场景 | IO密集型 | CPU密集型 |
2.2 性能测试对比(4核CPU)
# CPU密集型任务测试
def cpu_task(n):while n > 0:n -= 1# 多线程耗时:8.2秒
# 多进程耗时:2.1秒
三、线程与进程的创建实战
3.1 多线程基础模板
import threadingdef download_file(url):print(f"开始下载 {url}")# 模拟IO操作time.sleep(2)print(f"完成下载 {url}")threads = []
for url in ["url1", "url2", "url3"]:t = threading.Thread(target=download_file, args=(url,))threads.append(t)t.start()for t in threads:t.join()
3.2 多进程进阶模板
from multiprocessing import Process, cpu_countdef process_data(chunk):result = sum(x*x for x in chunk)print(f"处理结果:{result}")if __name__ == "__main__":data = list(range(1_000_000))chunk_size = len(data) // cpu_count()processes = []for i in range(cpu_count()):chunk = data[i*chunk_size : (i+1)*chunk_size]p = Process(target=process_data, args=(chunk,))processes.append(p)p.start()for p in processes:p.join()
四、锁机制深度解析
4.1 资源竞争问题重现
# 银行账户案例(存在竞态条件)
class BankAccount:def __init__(self):self.balance = 100def withdraw(self, amount):if self.balance >= amount:time.sleep(0.1) # 模拟处理延迟self.balance -= amountaccount = BankAccount()def thread_task():for _ in range(10):account.withdraw(10)# 启动10个线程后余额可能变为负数!
4.2 线程锁解决方案
lock = threading.Lock()def safe_withdraw(amount):with lock: # 自动获取和释放锁if account.balance >= amount:time.sleep(0.1)account.balance -= amount
4.3 进程锁的特殊处理
from multiprocessing import Process, Lockdef process_task(lock, value):lock.acquire()try:print(f"安全修改共享值: {value}")finally:lock.release()if __name__ == "__main__":lock = Lock()procs = [Process(target=process_task, args=(lock, i)) for i in range(3)][p.start() for p in procs][p.join() for p in procs]
五、高级锁机制扩展
5.1 可重入锁(RLock)
rlock = threading.RLock()def nested_lock():with rlock:with rlock: # 允许嵌套锁定print("双重锁定安全执行")threading.Thread(target=nested_lock).start()
5.2 信号量控制
semaphore = threading.Semaphore(3) # 允许3个并发def limited_resource():with semaphore:print(f"资源使用中 {threading.current_thread().name}")time.sleep(2)for i in range(10):threading.Thread(target=limited_resource).start()
六、最佳实践总结
1. 选择策略:
- 文件/网络操作 → 多线程
- 数学计算/数据处理 → 多进程
- 混合型任务 → 线程池+进程池组合
2. 锁使用原则:
- 尽量使用with语句自动管理
- 避免嵌套死锁(Lock与RLock选择)
- 进程锁需要Pickle序列化支持
3. 性能优化技巧:
# 进程池优化示例
from concurrent.futures import ProcessPoolExecutorwith ProcessPoolExecutor(max_workers=4) as executor:results = executor.map(cpu_intensive_func, data_chunks)
4. 常见陷阱规避:
- 多进程的if name == "main"必须声明
- 避免跨进程直接共享文件句柄
- 使用Manager()管理复杂共享对象
Python相关文章(推荐)
Python全方位指南 | Python(1)Python全方位指南:定义、应用与零基础入门实战 |
Python基础数据类型详解 | Python(2)Python基础数据类型详解:从底层原理到实战应用 |
Python循环 | Python(3)掌握Python循环:从基础到实战的完整指南 |
Python列表推导式 | Python(3.1)Python列表推导式深度解析:从基础到工程级的最佳实践 |
Python生成器 | Python(3.2)Python生成器深度全景解读:从yield底层原理到万亿级数据处理工程实践 |
Python函数编程性能优化 | Python(4)Python函数编程性能优化全指南:从基础语法到并发调优 |
Python数据清洗 | Python(5)Python数据清洗指南:无效数据处理与实战案例解析(附完整代码) |
Python邮件自动化 | Python(6)Python邮件自动化终极指南:从零搭建企业级邮件系统(附完整源码) |
Python通配符基础 | Python(7)Python通配符完全指南:从基础到高阶模式匹配实战(附场景化代码) |
Python通配符高阶 | Python(7 升级)Python通配符高阶实战:从模式匹配到百万级文件处理优化(附完整解决方案) |
Python操作系统接口 | Python(8)Python操作系统接口完全指南:os模块核心功能与实战案例解析 |
Python代码计算全方位指南 | Python(9)Python代码计算全方位指南:从数学运算到性能优化的10大实战技巧 |
Python数据类型 | Python(10)Python数据类型完全解析:从入门到实战应用 |
Python判断语句 | Python(11)Python判断语句全面解析:从基础到高级模式匹配 |
Python参数传递 | Python(12)深入解析Python参数传递:从底层机制到高级应用实践 |
Python面向对象编程 | Python(13)Python面向对象编程入门指南:从新手到类与对象(那个她)的华丽蜕变 |
Python内置函数 | Python(14)Python内置函数完全指南:从基础使用到高阶技巧 |
Python参数传递与拷贝机制 | Python(15)Python参数传递与拷贝机制完全解析:从值传递到深拷贝实战 |
Python文件操作 | Python(16)Python文件操作终极指南:安全读写与高效处理实践 |
Python字符编码 | Python(17)Python字符编码完全指南:从存储原理到乱码终结实战 |
Python中JSON的妙用 | Python(18)Python中JSON的妙用:详解序列化与反序列化原理及实战案例 |
相关文章:
Python(19)Python并发编程:深入解析多线程与多进程的差异及锁机制实战
目录 一、背景:Python并发编程的必要性二、核心概念对比2.1 技术特性对比表2.2 性能测试对比(4核CPU) 三、线程与进程的创建实战3.1 多线程基础模板3.2 多进程进阶模板 四、锁机制深度解析4.1 资源竞争问题重现4.2 线程锁解决方案4.3 进程锁的…...
赛灵思 XCVU440-2FLGA2892E XilinxFPGA Virtex UltraScale
XCVU440-2FLGA2892E 属于 Xilinx Virtex UltraScale 系列,是面向高端应用的旗舰 FPGA 器件。该系列产品以出色的高并行处理能力、丰富的逻辑资源和高速互联能力闻名,广泛用于 高性能计算、数字信号处理等对计算能力和带宽要求极高的场景。采用先进的 20n…...
UE5 相机裁剪面
UE5无法单独修改相机的裁剪面,不论是场景相机还是游戏相机都不可以 只能在配置里统一修改 项目设置里直接搜clip...
uniapp自定义底部导航栏,解决下拉时候顶部空白的问题
一、背景 最近使用uniapp开发微信小程序,因为使用了自定义的顶部导航栏,所以在ios平台上(Android未测试)测试的时候,下拉的时候会出现整个页面下拉并且顶部留下大片空白的问题 二、任务:解决这个问题 经…...
vue2 element-ui 中 el-radio 单选框点击事件失效问题
前情提要 点进这篇文章的小伙伴,应该和博主一样,都是遇到了这种单选框可点击取消的需求。也就只有这种不同寻常的需求,才能让我们发现element框架的缺陷点,话不多说,下面博主来提供一个解决思路。 click为什么无法触发…...
yolov8复现
Yolov8的复现流程主要包含环境配置、下载源码和验证环境三大步骤: 环境配置 查看电脑状况:通过任务管理器查看电脑是否有独立显卡(NVIDIA卡)。若有,后续可安装GPU版本的pytorch以加速训练;若没有࿰…...
提高Qt工作线程的运行速度
1. 使用线程池(QThreadPool)替代单一线程 做过,但是当时没想到。。。 目的:减少线程创建和销毁的开销,复用线程资源。 实现步骤: 创建自定义任务类:继承QRunnable,实现run()方法。…...
ZStack文档DevOps平台建设实践
(一)前言 对于软件产品而言,文档是不可或缺的一环。文档能帮助用户快速了解并使用软件,包括不限于特性概览、用户手册、API手册、安装部署以及场景实践教程等。由于软件与文档紧密耦合,面对业务的瞬息万变以及软件的飞…...
网络规划设计之广域网结构设计,6种架构模式对比
在数字化转型的浪潮中,网络基础设施的设计理念正在发生深刻变革。传统的基于点线拓扑的研究方法已无法满足现代复杂网络的需求,取而代之的是更具系统性的网络结构设计理念。本文将深入解析网络结构的定义特征,并重点剖析六种主流广域网架构的…...
FortiAI 重塑Fortinet Security Fabric全面智能化进阶
专注推动网络与安全融合的全球性综合网络安全解决方案供应商 Fortinet(NASDAQ:FTNT),近日宣布,旗下 Fortinet Security Fabric 安全平台成功嵌入了 FortiAI 关键创新功能。这一举措将有效增强用户对各类新兴威胁的防护…...
uniapp h5接入地图选点组件
uniapp h5接入地图选点组件 1、申请腾讯地图key2、代码接入2.1入口页面 (pages/map/map)templatescript 2.2选点页面(pages/map/mapselect/mapselect)templatescript 该内容只针对uniapp 打包h5接入地图选点组件做详细说明&#x…...
Openfein实现远程调用的方法(实操)
文章目录 环境准备一、URL中接收参数二、接收一个参数三、接收多个参数四、传递对象五、传递JSON格式数据 环境准备 下面的配置,服务调用方加入即可。 依赖导入: <!-- openfeign依赖--><dependency><groupId>org.springframe…...
Matter如何终结智能家居生态割据,重构你的居住体验?
现阶段,Zigbee、Z-Wave、Thread、Wi-Fi与蓝牙等多种通信协议在智能家居行业中已得到广泛应用,但协议间互不兼容的通信问题仍在凸显。由于各协议自成体系、彼此割据,智能家居市场被迫催生出大量桥接器、集线器及兼容性软件以在不同生态的设备间…...
Thin-Agent服务(TAS)概述
### **Thin-Agent服务(TAS)概述** **Thin-Agent服务(TAS)** 是一种轻量级监控服务,通过 **BMC/IPMI**(基板管理控制器/智能平台管理接口)收集**硬件和操作系统特定数据**,为系统管…...
2025.4.17学习日记 初识JavaScript 以及Java和JavaScript有什么区别
Java 和 JavaScript 虽然名字相似,但实际上是两种不同的编程语言。 1. 语言背景和设计目的 Java:由 Sun Microsystems(现被 Oracle 收购)在 1995 年推出。设计初衷是为了实现 “一次编写,到处运行(Write O…...
python学习—合并多个word文档
系列文章目录 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停,游戏抽签抽奖 python学习—循环语句-控制流 python学习—合并多个Excel工作簿表格文件 pytho…...
01、单片机简介
单片机简介 1、什么是单片机2、STM32F103ZET6介绍2.1、参数的含义2.2、存储器映射 3、外设寄存器介绍 1、什么是单片机 单片机(Single-Chip Microcomputer)是一种微型计算机,是一种集成电路芯片。把具有数据处理能力的中央处理器CPU、随机存储器RAM、闪存flash、多…...
常用UI设计工具及平台概览
在当今快速发展的数字世界中,UI设计平台成为设计师和开发者创建用户界面不可或缺的利器。这些平台不仅支持从简单原型到复杂交互设计的各种需求,而且许多还提供将设计直接转换为代码的功能,极大地提高了开发效率。下面将为您介绍几个主流的UI设计工具及其特点,帮助您根据项…...
考研单词笔记 2025.04.17
associate v联系,联想n同事,伙伴,朋友a副的,准的,非正式的 association n联系,联想,协会,社团,关系,交往 associative a联想的 bond n纽带,联系…...
MySQL常用SQL语句的示例
概述 MySQL 常用 SQL 语句的示例,涵盖数据定义、操作、查询等常见场景 一、数据库操作 创建数据库 CREATE DATABASE mydb;选择数据库 USE mydb;删除数据库 DROP DATABASE mydb;二、表操作 创建表 CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VAR…...
java 多线程之Worker Thread模式(Thread Pool模式)
Worker Thread模式 Worker的意思是工作的人,在Worker Thread模式中,工人线程Worker thread会逐个取回工作并进行处理,当所有工作全部完成后,工人线程会等待新的工作到来。 Worker Thread模式也被成为Background Threadÿ…...
4月17日星期四今日早报简报微语报早读
4月17日星期四,农历三月二十,早报#微语早读。 1、国家统计局:一季度国内生产总值同比增长5.4%; 2、我国博士后已超40万人,2024年招收人数再创新高; 3、神舟二十号计划近日择机实施发射,船箭组…...
【最新版】芸众商城独立版源码 425+插件 全新后台框架
一.系统介绍 芸众商城系统最新版 已经更新425全插件版,一套系统支持各种新零售、商城、模式,天天美丽链动商城。不要相信那些外面的旧版本。旧版本等于是废品,无法小程序运营的,框架还是旧的! 芸众系统最新版 服务器可…...
android liveData observeForever 与 observe对比
LiveData 是一个非常有用的组件,用于在数据变化时通知观察者。LiveData 提供了两种主要的观察方法:observe 和 observeForever。这两种方法在使用场景、生命周期感知以及内存管理等方面有所不同。 一、observe 方法 1. 基本介绍 生命周期感知:observe…...
定制化 Docsify 文档框架实战分享
🌟 定制化 Docsify 文档框架实战分享 在构建前端文档平台时,我们希望拥有更友好的用户界面、便捷的搜索、清晰的目录导航以及实用的代码复制功能。借助 Docsify,我实现了以下几个方面的定制优化,分享给大家 🙌。 &…...
蓝桥杯题目:二维前缀和
首先分析一下二维数组的差分。s[x2][y2]-s[x1][y1]s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]s[x1-1][y1-1] 因为对于二维数组x2y2-x1y1范围内的值需要通过x2y2减去从x1,y2-1的这段存储的前缀和以及减去x2-1,y1这两部分的前缀和,但是还有一个x1-1&a…...
数字孪生城市技术应用典型实践案例汇编(22个典型案例)(附下载)
近年来,数字孪生技术在我国从战略框架逐步向系统性落地推进,成为推动数字中国建设的重要技术引擎。随着《数字中国建设整体布局规划》《"十四五"数字经济发展规划》《深化智慧城市发展推进城市全域数字化转型的指导意见》等政策的实施…...
Linux——信号(1)信号的产生
我们在讲进程的多种状态时提到过,一个进程的退出有三种情况:正常退出,结果出错退出(代码也执行完了),异常终止退出(代码未执行完),其中最后一种退出相当于进程在运行时&a…...
【模型常见评价指标(分类)】
目录 常见指标 其他的评估指标 3.1 BLEU 3.2 ROUGE 3.3 困惑度PPL(perplexity) 常见指标 其他的评估指标 3.1 BLEU BLEU(Bilingual Evaluation Understudy,双语评估替补)分数是评估一种语言翻译成另一种语言的文本质量的指标。它将“质…...
个人博客系统后端 - 用户信息管理功能实现指南(上)
本文记录了如何实现用获取户信息,用户信息更新,用户头像上传三大基础功能 先上接口实现截图: 一、项目结构概览 先介绍一下 个人博客系统采用了标准的 Spring Boot 项目结构,用户功能相关的文件主要分布在以下几个目录:…...
CyberAgentAILab 开源数字人项目TANGO,heygen的开源版来了~
简介 TANGO 是 CyberAgentAILab 开源的一项前沿研究成果,其初衷在于探索高效生成模型在实际应用场景中的表现。项目诞生于 CyberAgent 在整合创意与人工智能的实践中,旨在为数字内容生成、交互和实时渲染等领域提供一个高性能、模块化、可扩展的解决方案…...
高等数学同步测试卷 同济7版 试卷部分 上 做题记录 上册期中同步测试卷 A 卷
上册期中同步测试卷A卷 一、单项选择题(本大题共5小题,每小题3分,总计15 分) 1. 2. 3. 4. 5. 二、填空题(本大题共5小题,每小题3分,总计15分) 6. 7. 8. 9. 10. 三、求解下列各题(本大题共5小题,每小题6分,总计30分) 11. …...
4.16 AT好题选做
文章目录 前言[ARC103D] Distance Sums(确定树的形态,trick)[AGC062B] Split and Insert(区间 d p dp dp)[AGC012E] Camel and Oases(状压,可行性dp转最优性dp)[ARC094D] Normalization(trick,转化)[ARC125F] Tree Degree Subset Sum(结论,a…...
数据库-day06
一、实验名称和性质 分类查询 验证 综合 设计 二、实验目的 1.掌握数据查询的Group by ; 2. 掌握聚集函数的使用方法。 三、实验的软硬件环境要求 硬件环境要求: PC机(单机) 使用的软件名称、版本号以及模块: …...
基于Flask的漏洞挖掘知识库系统设计与实现
基于Flask的漏洞挖掘知识库系统设计与实现 一、系统架构设计 1.1 整体架构 本系统采用经典的三层Web架构,通过Mermaid图展示的组件交互流程清晰呈现了以下核心模块: 前端展示层:基于Bootstrap5构建响应式界面业务逻辑层:Flask…...
小白从0学习网站搭建的关键事项和避坑指南
以下是针对小白从零学习网站搭建时需要注意的关键事项和避坑指南,帮助你高效学习、少走弯路: 一、学习路径注意事项 不要跳过基础 误区:直接学习框架(如 React、Laravel)而忽视 HTML/CSS/JS 基础。 正确做法ÿ…...
OpenAI 推出一对 AI 推理模型 o3 和 o4-mini
OpenAI 于 2025 年 4 月 16 日(美国东部时间)宣布推出两款全新的 AI 推理模型——o3 与 o4-mini,它们能够在给出最终回答前进行思考与推理。 本文中所有的 ChatGPT 服务,由 ChatShare 镜像站 提供,无需担心网络和地区限…...
知识了解03——怎么解决使用npm包下载慢的问题?
1、为什么使用npm下载包会下载的慢 因为使用npm下载包时,默认使用国外服务器进行下载,此时的网络传输需要经过漫长的海底电缆,因此下载速度会变慢 2、怎么解决?(切换镜像源) (1)方…...
【网络】IP层的重要知识
目录 1.IP层的作用 2.主机和节点 3.网络层和数据链路层的关系 4.路由控制 4.1.路由控制的过程 4.2. IP地址与路由控制 4.3.路由控制表的聚合 4.4.静态路由和动态路由 4.5.动态路由的基础 5.数据链路的抽象化 5.1.数据链路不同,MTU则相异 5.2.路径MTU发…...
【随身WIFI】随身WiFi Debian系统优化教程
0.操作前必看 本教程基于Debian系统进行优化,有些操作对随身WiFi来说可能会带来负优化,根据需要选择。 所有操作需要在root用户环境下运行,否则都要加sudo 随身wifi Debian系统,可以去某安的随声WiFi模块自行搜索刷机 点赞&am…...
IPCC指南主要变化(各版本)
1996年IPCC国家温室气体清单指南 背景:是IPCC较早发布的指南之一,为国家温室气体清单编制提供了基础方法。 内容:包括了对温室气体排放源和汇的估算方法,涵盖了能源、工业、农业等多个部门。 2006年IPCC国家温室气体清单指南 背…...
关于Diamond机械手的运动学与动力学的推导
1.关于Diamond机械手 (1)位置模型推导 逆解:机械末端平台的位置与驱动关节之间的关系。 设p点在xy平面的坐标是(x,y)T,此时根据向量求解 OP等于向量r等于e向xy轴的向量主动臂长度向xy轴的向量…...
@JsonSerialize注解自定义序列化方式
JsonSerialize注解自定义序列化方式 文章目录 JsonSerialize注解自定义序列化方式**前言****创建自定义序列化器****应用自定义序列化器****测试序列化结果****高级用法:全局注册序列化器****关键点解析****常见问题解决****问题1:序列化结果不符合预期*…...
第二篇:linux之Xshell使用及相关linux操作
第二篇:linux之Xshell使用及相关linux操作 文章目录 第二篇:linux之Xshell使用及相关linux操作一、Xshell使用1、Xshell安装2、Xshell使用 二、Bash Shell介绍与使用1、什么是Bash Shell(壳)?2、Bash Shell能干什么?3、平时如何使…...
qt中关于思源雅黑字体的使用
首先,需要下载一份思源雅黑字体,我放在了下面位置,https://download.csdn.net/download/Littlehero_121/90631851 2、关于qt中的使用操作,如下: //QString path "绝对路径";QString path QCoreApplicatio…...
用 MongoIndexStore 实现对话存档和恢复 实现“多用户、多对话线程”场景(像一个 ChatGPT 对话列表那样)
用LlamaIndex写两个完整实用的案例! 实现如何用 MongoIndexStore 实现对话存档和恢复实现“多用户、多对话线程”场景(像一个 ChatGPT 对话列表那样) ✅ 案例一:使用 MongoIndexStore 实现对话存档 恢复 单用户 单对话线程&am…...
接口测试:实用指南4.0
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
2000-2017年各省国有经济煤气生产和供应业固定资产投资数据
2000-2017年各省国有经济煤气生产和供应业固定资产投资数据 1、时间:2000-2017年 2、来源:国家统计局、能源年鉴 3、指标:行政区划代码、城市、年份、国有经济煤气生产和供应业固定资产投资 4、范围:31省 5、指标说明&#x…...
AOP的基本应用案例---统计每个函数的执行时间
1.导入依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 2.准备好要计算的SpringBoot的项目(本案例以service的实现类为例) 3.编写AOP的代码: package c…...
前端复习遗忘的知识点
这个是我个人平常学习一些博主的东西,如果侵权请联系我或者让我标上博主平台等信息,谢谢! 1:如图涉及知识点jq: 1.获取元素 document.getElementById(""); document.getElementsByClassName(); document.g…...