东莞列举网 > 商务服务 > 网站/软件服务 > 五种线程锁基本介绍2和3
东莞
[切换城市]

五种线程锁基本介绍2和3

更新时间:2021-11-30 10:54:13 浏览次数:18次
区域: 东莞 > 南城
类别:IDC服务
地址:南城高盛科技大厦
二:RLock() 递归锁
递归锁是同步锁的一个升级版本,在同步锁的基础上可以做到连续重复使用多次acquire()后再重复使用多次release()的操作,但是一定要注意加锁次数和解锁次数必须一致,否则也将引发死锁现象。

下面是threading模块与递归锁提供的相关方法:
方法      描述
threading.RLock()      返回一个递归锁对象
lockObject.acquire(blocking=True, timeout=1)      上锁,当一个线程在执行被上锁代码块时,将不允许切换到其他线程运行,默认锁失效时间为1秒
lockObject.release()      解锁,当一个线程在执行未被上锁代码块时,将允许系统根据策略自行切换到其他线程中运行
lockObject.locaked()      判断该锁对象是否处于上锁状态,返回一个布尔值
使用方式
以下是递归锁的简单使用,下面这段操作如果使用同步锁则会发生死锁现象,但是递归锁不会:图一
with语句
由于threading.RLock()对象中实现了enter__()与__exit()方法,故我们可以使用with语句进行上下文管理形式的加锁解锁操作:图二
三:Condition() 条件锁
基本介绍
条件锁是在递归锁的基础上增加了能够暂停线程运行的功能。并且我们可以使用wait()与notify()来控制线程执行的个数。

注意:条件锁可以自由设定一次放行几个线程。

下面是threading模块与条件锁提供的相关方法:
方法      描述
thre***ndition()      返回一个条件锁对象
lockObject.acquire(blocking=True, timeout=1)      上锁,当一个线程在执行被上锁代码块时,将不允许切换到其他线程运行,默认锁失效时间为1秒
lockObject.release()      解锁,当一个线程在执行未被上锁代码块时,将允许系统根据策略自行切换到其他线程中运行
lockObject.wait(timeout=None)      将当前线程设置为“等待”状态,只有该线程接到“通知”或者超时时间到期之后才会继续运行,在“等待”状态下的线程将允许系统根据策略自行切换到其他线程中运行
lockObject.wait_for(predicate, timeout=None)      将当前线程设置为“等待”状态,只有该线程的predicate返回一个True或者超时时间到期之后才会继续运行,在“等待”状态下的线程将允许系统根据策略自行切换到其他线程中运行。注意:predicate参数应当传入一个可调用对象,且返回结果为bool类型
lockObject.notify(n=1)      通知一个当前状态为“等待”的线程继续运行,也可以通过参数n通知多个
lockObject.notify_all()      通知所有当前状态为“等待”的线程继续运行
使用方式
下面这个案例会启动10个子线程,并且会立即将10个子线程设置为等待状态。

然后我们可以发送一个或者多个通知,来恢复被等待的子线程继续运行:图三 图四
with语句
由于thre***ndition()对象中实现了enter__()与__exit()方法,故我们可以使用with语句进行上下文管理形式的加锁解锁操作:图五
东莞网站/软件服务相关信息
2023-09-15
注册时间:2021年07月02日
UID:725737
---------- 认证信息 ----------
手机已认证
查看用户主页