对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发腾讯微博代码分享
Jan 10 Python
Python中的pass语句使用方法讲解
May 14 Python
详解Python3中yield生成器的用法
Aug 20 Python
python的else子句使用指南
Feb 27 Python
Python+微信接口实现运维报警
Aug 27 Python
python实现txt文件格式转换为arff格式
May 31 Python
django认证系统实现自定义权限管理的方法
Jul 16 Python
从请求到响应过程中django都做了哪些处理
Aug 01 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
python飞机大战游戏实例讲解
Dec 04 Python
Python实现抖音热搜定时爬取功能
Mar 16 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 中文字符入库或显示乱码问题的解决方法
2010/04/12 PHP
php foreach循环中使用引用的问题
2013/11/06 PHP
php中的动态调用实例分析
2015/01/07 PHP
PHP的引用详解
2015/02/22 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
JavaScript 布尔操作符解析  && || !
2012/08/10 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
jquery检测input checked 控件是否被选中的方法
2014/03/26 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
vue购物车插件编写代码
2017/11/27 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
python时间整形转标准格式的示例分享
2014/02/14 Python
java直接调用python脚本的例子
2014/02/16 Python
线程和进程的区别及Python代码实例
2015/02/04 Python
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
python操作toml文件的示例代码
2020/11/27 Python
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
全球工业:Global Industrial
2020/02/01 全球购物
文明生主要事迹
2014/05/25 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书