当前位置: 首页 > 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.dtcms.com/a/189304.html

相关文章:

  • 关于索引的使用
  • pe文件二进制解析(用c/c++解析一个二进制pe文件)
  • HTTP协议解析:Session/Cookie机制与HTTPS加密体系的技术演进(二)
  • 基于STM32、HAL库的PCM3060PWR 音频接口芯片驱动程序设计
  • UDP协议详细讲解及C++代码实例
  • 转发多台px4仿真UDP数据到地面站
  • KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache
  • sqlserver免费版每天备份数据库
  • 【计算机网络】3数据链路层②
  • 数据结构(一) 绪论
  • 进程与线程:07 CPU调度策略
  • 黑马Java基础笔记-10
  • Spring框架请求注解
  • Java键盘鼠标事件监听器(鼠标)MouseListener、MouseMotionListener、MouseWheelListener和(键盘)keyListener
  • 科学养生,开启健康生活
  • Spring Security与SaToken的对比
  • 机试刷题:进制转换3
  • 蓝桥杯题库经典题型
  • 【Linux】操作系统入门:冯诺依曼体系结构
  • Python作业练习3
  • 【愚公系列】《Manus极简入门》036-物联网系统架构师:“万物互联师”
  • mysql环境配置
  • do while
  • 『大模型笔记』Langchain作者Harrison Chase专访:环境智能体与全新智能体收件箱
  • 从零开始掌握FreeRTOS(1)移植到STM32
  • Java Web 应用安全响应头配置全解析:从单体到微服务网关的实践
  • 【大模型LLM学习】MiniCPM的注意力机制学习
  • C语言| 静态局部变量
  • FastDDS Transport功能模块初步整理
  • ST25DV04K NFC TAG 使用日志