对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中executemany和序列的使用方法
Aug 12 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
Mar 29 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
Jun 04 Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
Nov 20 Python
python下载微信公众号相关文章
Feb 26 Python
pandas 层次化索引的实现方法
Jul 06 Python
深入浅析python的第三方库pandas
Feb 13 Python
python实现贪吃蛇双人大战
Apr 18 Python
python如何进行矩阵运算
Jun 05 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 Python
详解运行Python的神器Jupyter Notebook
Jun 03 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批量生成静态HTML的简单原理和方法
2014/04/20 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
PHP会话处理的10个函数
2015/08/11 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
快速创建python 虚拟环境
2020/11/28 Python
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
Linux的主要特性
2014/10/06 面试题
英文自荐信常用句子
2014/03/26 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
2016年情人节问候语
2015/11/11 职场文书
Python数据处理的三个实用技巧分享
2022/04/01 Python
详解SQL报错盲注
2022/07/23 SQL Server