当前位置: 首页 > news >正文

python中的进程锁与线程锁

在Python中,线程和进程使用锁的机制有所不同,需分别通过threadingmultiprocessing模块实现。以下是具体用法及注意事项:


一、线程锁(Thread Lock)

  1. 基本用法
    线程锁用于多线程环境下保护共享资源,防止数据竞争。核心类是threading.Lock,通过acquire()release()方法控制锁的获取与释放,或使用上下文管理器简化操作。
import threadinglock = threading.Lock()
shared_data = 0def increment():global shared_datawith lock:  # 自动管理锁的获取和释放shared_data += 1# 创建多个线程
threads = [threading.Thread(target=increment) for _ in range(10)]
for t in threads:t.start()
for t in threads:t.join()
print(shared_data)  # 输出结果为10
  1. 高级锁类型
    • 可重入锁(RLock):允许同一线程多次获取锁,避免死锁,适用于递归场景。
rlock = threading.RLock()
with rlock:# 可嵌套获取同一锁with rlock:# 执行操作

• 信号量(Semaphore):限制并发线程数,例如控制数据库连接池的最大连接数。

sem = threading.BoundedSemaphore(3)  # 最多允许3个线程同时运行
with sem:# 访问资源
  1. 注意事项
    • 避免死锁:确保锁的获取顺序一致,使用try...finallywith语句保证锁释放。

• 减少锁持有时间:仅对共享资源操作加锁,避免长时间阻塞其他线程。


二、进程锁(Process Lock)

  1. 基本用法
    进程锁通过multiprocessing.Lock实现,用法与线程锁类似,但需配合进程间共享内存(如multiprocessing.Value)。
import multiprocessinglock = multiprocessing.Lock()
shared_counter = multiprocessing.Value('i', 0)def increment(counter, lock):for _ in range(1000):with lock:counter.value += 1# 创建进程
processes = [multiprocessing.Process(target=increment, args=(shared_counter, lock)) for _ in range(4)]
for p in processes:p.start()
for p in processes:p.join()
print(shared_counter.value)  # 输出4000
  1. 进程锁与线程锁的区别
    • 作用范围:线程锁仅在同一进程的线程间生效,进程锁用于跨进程同步。

• 共享资源管理:进程间共享数据需使用multiprocessing模块的特殊数据结构(如ValueArray)。

http://www.xdnf.cn/news/430885.html

相关文章:

  • Mysql 事物
  • React状态管理-对state进行保留和重置
  • FCB文件疑问+求助:01 百度网盘视频自动生成AI笔记pdf会出现对应fcb文件-作用待详解
  • FFmpeg3.4 libavcodec协议框架增加新的decode协议
  • INFINI Console 纳管 Elasticsearch 9(一):指标监控、数据管理、DSL 语句执行
  • 深入理解 C++ 标准模板库(STL):从基础到实践
  • 不用mathtype将word中的公式修改成新罗马字体(加编号)
  • Android设备是否满足硬件要求
  • R-tree详解
  • 快速幂算法详解
  • 【前端】【JavaScript】【总复习】四万字详解JavaScript知识体系
  • 【C++进阶篇】二叉搜索树的实现(赋源码)
  • 国产大模型「五强争霸」,决战AGI!
  • upload-labs通关笔记-第3关 文件上传之黑名单绕过
  • 数据结构(2)线性表-顺序表
  • 二次封装 el-dialog 组件:打造更灵活的对话框解决方案
  • VUE_UI组件的二次封装
  • Redis Cluster 集群搭建和集成使用的详细步骤示例
  • 微信小程序分包策略:优化加载性能与用户体验
  • 使用Kubernetes实现零停机部署
  • android抓包踩坑记录
  • linux系统如何将采集的串口数据存储到txt
  • TCP首部格式及三次握手四次挥手
  • 操作系统导论——第29章 基于锁的并发数据结构
  • 【25软考网工】第六章(5)应用层安全协议
  • 讯联云库项目开发日志(一)
  • 记录算法笔记(2025.5.13)二叉树的最大深度
  • 基于STM32、HAL库的ADAU1701JSTZ-RL音频接口芯片驱动程序设计
  • flink的TaskManager 内存模型
  • 奇怪的公式