对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 25 Python
Python实现自动添加脚本头信息的示例代码
Sep 02 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
wxpython实现图书管理系统
Mar 12 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
May 27 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 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
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
php去除字符串换行符示例分享
2014/02/13 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
2017/12/24 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
vue之延时刷新实例
2019/11/14 Javascript
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
详解python之heapq模块及排序操作
2019/04/04 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
django中related_name的用法说明
2020/05/20 Python
基于CentOS搭建Python Django环境过程解析
2020/08/24 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
马来西亚户外装备商店:PTT Outdoor
2019/07/13 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
户籍证明的格式
2014/01/13 职场文书
村捐赠仪式答谢词
2014/01/21 职场文书
大学生活自我评价
2014/04/09 职场文书
2015教师年度考核评语
2015/03/25 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL