python--锁

python锁的种类

threading.Lock()--互斥锁

threading.RLock--可重入锁

可重入锁(Reentrant Lock,简称 RLock) 是一种特殊类型的锁,允许同一个线程多次获取同一个锁而不会造成死锁。

获取和释放的方式

互斥锁

1. acquire()获取锁、release()释放锁
复制代码
from log import *

import threading
import time

# 共享资源
counter = 0
lock = threading.Lock()

def increment():
    global counter
    lock.acquire()
    try:
        counter += 1
        info("CUrrent thread: {}, Counter: {}".format(threading.current_thread().name, counter))
    finally:
        # 释放锁
        lock.release()

# 创建10个线程
threads = []
for _ in range(10):
    t = threading.Thread(target=increment)
    threads.append(t)
    t.start()

# 等待所有线程完成
for t in threads:
    t.join()
2. with 自动获取和释放锁
复制代码
from log import *

import threading
import time

counter = 0
lock = threading.Lock()

def increment():
    global counter
    # 使用 with 语句自动管理锁的获取和释放
    with lock:
        counter += 1
        info("Currrent thread: {0}, counter: {1}".format(threading.current_thread().name, counter))

# 创建10个线程
threads = []
for _ in range(10):
    t = threading.Thread(target=increment)
    threads.append(t)
    t.start()

for t in threads:
    t.join()

可重入锁

同Lock。

复制代码
from log import *

import threading
import time

rlock = threading.RLock()  # 可重入锁

def using_rlock():
    """使用可重入锁实现更灵活的控制"""
    print("进入 with 块")
    
    with rlock:
        print("第一次获取锁")
        
        # 在 with 块内再次获取锁
        print("准备再次获取锁(嵌套)")
        with rlock:  # 可重入锁允许这样做
            print("第二次获取锁(嵌套)")
            time.sleep(1)
        
        print("退出嵌套 with,但仍持有锁")
        
        # 如果我们想"模拟"释放后重新获取
        # 实际上我们需要退出当前的 with 上下文
        print("需要释放锁...")
    
    # 现在锁已释放
    
    print("锁已释放,执行无锁操作...")
    time.sleep(2)
    
    # 重新获取锁
    with rlock:
        print("重新获取锁")
        time.sleep(1)
    
    print("完成")

# 测试
using_rlock()
相关推荐
代码山河2 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行2 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
学长毕设2 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
梯度下降者2 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
zzu123zsw3 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
“AI国潮设计-小江”4 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
源码集结号4 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场4 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠5 小时前
泛微OAe9-后端二开异步调用
java
benchmark_cc5 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash