对python多线程中Lock()与RLock()锁详解


Posted in Python onJanuary 11, 2019

资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源的争用,甚至导致死锁

也可能导致读写混乱

锁提供如下方法:

1.Lock.acquire([blocking])

2.Lock.release()

3.threading.Lock() 加载线程的锁对象,是一个基本的锁对象,一次只能一个锁定,其余锁请求,需等待锁释放后才能获取

4.threading.RLock() 多重锁,在同一线程中可用被多次acquire。如果使用RLock,那么acquire和release必须成对出现,

调用了n次acquire锁请求,则必须调用n次的release才能在线程中释放锁对象

例如:

无锁:

#coding=utf8
import threading
import time

num = 0

def sum_num(i):
  global num
  time.sleep(1)
  num +=i
  print num

print '%s thread start!'%(time.ctime())

try:
  for i in range(6):
    t =threading.Thread(target=sum_num,args=(i,))
    t.start()

except KeyboardInterrupt,e:
  print "you stop the threading"

print '%s thread end!'%(time.ctime())

输出:

Sun May 28 20:54:59 2017 thread start!
Sun May 28 20:54:59 2017 thread end!
01
3
710
15

结果显示混乱

引入锁:

#coding=utf8
import threading
import time

num = 0

def sum_num(i):
  lock.acquire()
  global num
  time.sleep(1)
  num +=i
  print num
  lock.release()

print '%s thread start!'%(time.ctime())

try:
  lock=threading.Lock()
  list = []
  for i in range(6):
    t =threading.Thread(target=sum_num,args=(i,))
    list.append(t)
    t.start()

  for threadinglist in list:
    threadinglist.join()

except KeyboardInterrupt,e:
  print "you stop the threading"

print '%s thread end!'%(time.ctime())

结果:

Sun May 28 21:15:37 2017 thread start!
0
1
3
6
10
15
Sun May 28 21:15:43 2017 thread end!

其中:

lock=threading.Lock()加载锁的方法也可以换成lock=threading.RLock()

如果将上面的sum_num修改为:

lock.acquire()
  global num
  lock.acquire()
  time.sleep(1)
  num +=i
  lock.release()
  print num
  lock.release()

那么:

lock=threading.Lock() 加载的锁,则一直处于等待中,锁等待

而lock=threading.RLock() 运行正常

以上这篇对python多线程中Lock()与RLock()锁详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
从零学Python之入门(三)序列
May 25 Python
用Python制作简单的钢琴程序的教程
Apr 01 Python
Python切换pip安装源的方法详解
Nov 18 Python
Python处理文本换行符实例代码
Feb 03 Python
django表单的Widgets使用详解
Jul 22 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
Pytorch模型转onnx模型实例
Jan 15 Python
Python 定义只读属性的实现方式
Mar 05 Python
Python如何使用paramiko模块连接linux
Mar 18 Python
python hmac模块验证客户端的合法性
Nov 07 Python
Pandas中DataFrame交换列顺序的方法实现
Dec 14 Python
Python中requests库的用法详解
Jun 05 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 #Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 #Python
python通过配置文件共享全局变量的实例
Jan 11 #Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 #Python
Python设计模式之职责链模式原理与用法实例分析
Jan 11 #Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 #Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 #Python
You might like
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
Python修改Excel数据的实例代码
2013/11/01 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
python七夕浪漫表白源码
2019/04/05 Python
大学生个人简历自我评价
2013/11/16 职场文书
公积金转移接收函
2014/01/11 职场文书
2014的自我评价
2014/01/13 职场文书
小学教研工作制度
2014/01/15 职场文书
经典洗发水广告词
2014/03/13 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
党员转正申请报告
2015/05/15 职场文书
地震捐款简报
2015/07/21 职场文书
结婚十年感言
2015/07/31 职场文书
mysql优化
2021/04/06 MySQL
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫
python实现简单的三子棋游戏
2022/04/28 Python