对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 域名分析工具实现代码
Jul 15 Python
Python中使用item()方法遍历字典的例子
Aug 26 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
对Python中数组的几种使用方法总结
Jun 28 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
Jan 15 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
dpn网络的pytorch实现方式
Jan 14 Python
python实现学生信息管理系统(精简版)
Nov 27 Python
关于Python中*args和**kwargs的深入理解
Aug 07 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
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
HTML代码中标签的全部属性 中文注释说明
2009/03/26 Javascript
Mootools 1.2教程 函数
2009/09/15 Javascript
javascript 拖放效果实现代码
2010/01/22 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
在vue中获取dom元素内容的方法
2017/07/10 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
JavaScript实现的拼图算法分析
2019/02/13 Javascript
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
Python正则表达式教程之一:基础篇
2017/03/02 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
Django model反向关联名称的方法
2018/12/15 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
入党自我评价优缺点
2014/01/25 职场文书
土建工程师岗位职责
2014/06/10 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
安全生产奖惩制度
2015/08/06 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang
Elasticsearch 聚合查询和排序
2022/04/19 Python