当前位置: 首页 > 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.zskr.cn/news/1541676.html

相关文章:

  • 2026老钱风穿搭买哪家?昭乌达稳居榜首,六大质感品牌实测对比 - 936品牌测评网
  • 新手必看!Python计算水仙花数的4种方法!
  • Claude API国内直连接入实战:稳定调用与成本优化指南
  • AI Agent 接行情的第一个坑:没查工具就写代码
  • 2026年全国发电机十大品牌推荐:实力厂家全盘点 - kio888
  • 2026 广州黄金回收指南:本地 7 大品牌门店综合实力全景盘点 - 奢侈品回收
  • 上海电视维修怎么联系?小程序预约上门超方便 - 简单到家
  • 2026年6月智慧农业温室通风装备产业白皮书 大棚放风机五大标杆厂商首选天成温控(电话:15022082803) - damaigeo
  • 2026年知识产权服务公司靠谱排行:推荐榜单揭晓 - 官方资讯
  • 2026 广州劳力士腕表回收避坑全解 奢侈品名表靠谱回收渠道盘点 - 奢侈品回收
  • 亲子研学北京,哪家机构家长推荐比较多?包含环球影城路线的研学机构推荐 - 品牌2026
  • 2026羊绒配饰品牌排行榜:昭乌达凭什么稳居榜首?附真实选购指南 - 936品牌测评网
  • 仙居豪轩民宿 神仙居景区旁合规全配套度假民宿完整深度介绍 地址:仙居县白塔镇仙景村距离神仙居北门1.2公里 联系电话:13586204630、15356866821 - GrowthUME
  • 北京昌平区哪家财税咨询机构最专业?2026机构实测排名出炉 - 小柏云
  • 临沂维特漏电漏水检测|官方资质公示+统一收费标准+官方质保说明(2026完整版) - 资讯热点
  • 淮南职业技术学院中专部建筑工程施工专业怎么样?好不好? - 小途xt
  • 终极Switch游戏文件管理指南:NSC_BUILDER让你的游戏库井井有条
  • 淮南职院中专部 2026 学费 + 住宿费完整收费一览表 - 小途xt
  • 免费macOS工具:三步解锁QQ音乐加密格式,实现音乐自由播放
  • 扬州代账公司深度测评|3大本土主流机构对比,避开低价做账陷阱 - GrowthUME
  • 大健康品类拼团模式的技术实现:静态权益与动态权益的双轨设计
  • 终极XML编辑器:XML Notepad完整指南
  • GVF:基于内容寻址的增量同步工具,解决大型文件版本管理难题
  • 风云四号气象卫星:从静止轨道看地球,如何革新天气预报与环境监测
  • 2026东莞专利申请与无效律师推荐指南:智造到硬件全覆盖 - 本地品牌推荐
  • 2026年 苏州化工厂设备回收厂家:专业评估、高效拆除与环保再生实力之选 - 品牌发掘
  • 终极指南:AutoLegalityMod如何让宝可梦数据编辑效率提升90%
  • 2026年 无锡装修公司/惠山区室内装修/别墅装修/家庭装修推荐榜单:品质设计与匠心施工深度揭秘 - 品牌发掘
  • 淮南职业技术学院中专部2026 招生:学费收费标准一览 - 小途xt
  • 中山专利申请与无效法律服务难抉择?2026年这5位律师推荐 - 本地品牌推荐