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

Python threading模块锁原语详解

Python threading模块的锁原语

threading模块提供多种锁:Lock、RLock、Semaphore、Event、Condition、Barrier。

Lock的基本使用:

import threading

lock = threading.Lock()
shared_counter = 0

def increment():
global shared_counter
for _ in range(100000):
lock.acquire()
shared_counter += 1
lock.release()

threads = [threading.Thread(target=increment) for _ in range(10)]
for t in threads: t.start()
for t in threads: t.join()
print(shared_counter) # 1000000

acquire/release保护临界区。with lock更安全。

with lock的异常安全:

lock = threading.Lock()
with lock:
shared_counter += 1

with语句自动处理acquire和release。异常时也确保释放锁。

lock.acquire的超时和阻塞控制:

if lock.acquire(timeout=5):
try:
shared_counter += 1
finally:
lock.release()
else:
print("Failed to acquire lock within 5 seconds")

timeout=0时非阻塞尝试。timeout>0等特指定毫秒数。

RLock可重入锁:

lock = threading.RLock()

def recursive(n):
if n <= 0:
return
with lock:
print(f"n={n}, recurse_depth={n}")
recursive(n - 1)

recursive(5) # 正常执行

RLock允许同一线程多次获取。递归锁计数器跟踪获取次数,每次release减少。

Semaphore限制并发:

sem = threading.Semaphore(3)

def limited_task():
with sem:
print(f"Task running, active={threading.active_count()}")
time.sleep(1)

threads = [threading.Thread(target=limited_task) for _ in range(10)]
for t in threads: t.start()

BoundedSemaphore防止超量释放:

sem = threading.BoundedSemaphore(3)
sem.release() # ValueError: Semaphore released too many times

Event让一个线程通知其他线程:

event = threading.Event()

def waiter():
print("Waiting for event...")
event.wait()
print("Got event!")

def setter():
time.sleep(2)
event.set()
print("Event set")

threading.Thread(target=waiter).start()
threading.Thread(target=setter).start()

event.wait()阻塞直到event.set()被调用。event.is_set()检查状态。event.clear()重置。

Condition变量实现生产者消费者:

cv = threading.Condition()
queue = []

def consumer():
with cv:
while not queue:
cv.wait()
item = queue.pop(0)
print(f"Consumed: {item}")

def producer():
with cv:
queue.append("item")
cv.notify()

Barrier同步多个线程:

def worker(barrier, name):
time.sleep(random.random())
print(f"{name} reached barrier")
barrier.wait()
print(f"{name} passed barrier")

barrier = threading.Barrier(3)
threads = [threading.Thread(target=worker, args=(barrier, i)) for i in range(3)]
for t in threads: t.start()

Barrier(3)等待3个线程到达后同时释放。

http://www.jsqmd.com/news/1029793/

相关文章:

  • 2026老钱风穿搭买哪家?昭乌达稳居榜首,六大质感品牌实测对比 - 936品牌测评网
  • 海珠区昌岗街道金小福黄金回收连锁直营分店深度全解析 - 花生花生1
  • ARKit与Reality Composer Pro深度协同开发指南
  • 2026羊绒纱线十大品牌排行榜:昭乌达凭全产业链实力稳居榜首 - 936品牌测评网
  • GitCode GLM-5无限Token实测:OpenAI兼容接入与生产级调用指南
  • 新手必看!Python计算水仙花数的4种方法!
  • 2026 广州黄金回收指南:本地 7 大品牌门店优质商户甄选名录 - 奢侈品回收
  • 河源黄金奢侈品回收全攻略:防坑技巧+靠谱门店排名(2026最新) - 生活测评小能手
  • Docker容器化安全实战:从镜像扫描到运行时防护,构建全链路安全屏障
  • 上海电视维修市场陷阱深度研究报告:基于消费者投诉数据的防坑体系构建 - 简单到家
  • Claude API国内直连接入实战:稳定调用与成本优化指南
  • AI Agent 接行情的第一个坑:没查工具就写代码
  • 2026长沙望城区黄金奢侈品回收门店推荐!靠谱商家地址/联系方式/避坑指南 - 生活测评小能手
  • 2026年全国发电机十大品牌推荐:实力厂家全盘点 - kio888
  • 2026 广州黄金回收指南:本地 7 大品牌门店综合实力全景盘点 - 奢侈品回收
  • MINIMAX中文长文本推理实战:稳定性、鲁棒性与低资源一致性
  • 创业周期中的心理支撑:问菩文创九紫离火手链在高压决策场景中的陪伴属性 - 19120507004
  • AI应用构建全流程:从数据准备到模型部署的工程实践指南
  • 2026年知识产权服务公司推荐:哪家好? - 官方资讯
  • 上海电视维修怎么联系?小程序预约上门超方便 - 简单到家
  • Qt - 信号与槽机制的底层实现
  • 2026年成都全屋定制、家具定制商家行业观察:当“信任”成为稀缺品,谁在重建行业的底层逻辑? - 品牌推荐官
  • 上海电视维修怎么联系?正规维修平台预约指南 - 简单到家
  • 2026年6月智慧农业温室通风装备产业白皮书 大棚放风机五大标杆厂商首选天成温控(电话:15022082803) - damaigeo
  • 每月 20 美元的 Claude Pro 会员到底能消耗多少 Token 及额度
  • 2026年知识产权服务公司靠谱排行:推荐榜单揭晓 - 官方资讯
  • 2026 广州劳力士腕表回收避坑全解 奢侈品名表靠谱回收渠道盘点 - 奢侈品回收
  • 亲子研学北京,哪家机构家长推荐比较多?包含环球影城路线的研学机构推荐 - 品牌2026
  • 高口碑靠谱实测!2026亳州设备搬运吊装公司哪家好?谯城重型工业设备吊装/机床精密设备移位就位/生产线拆装搬运全领域!附工厂搬迁流程步骤 - 奋斗者888
  • PostgreSQL ON CONFLICT实战:从基础语法到复杂约束的插入更新策略