对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 相关文章推荐
mac系统安装Python3初体验
Jan 02 Python
完美解决安装完tensorflow后pip无法使用的问题
Jun 11 Python
celery4+django2定时任务的实现代码
Dec 23 Python
python flask解析json数据不完整的解决方法
May 26 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
Sep 05 Python
解决django model修改添加字段报错的问题
Nov 18 Python
python实现在多维数组中挑选符合条件的全部元素
Nov 26 Python
如何完美的建立一个python项目
Oct 09 Python
python中绕过反爬虫的方法总结
Nov 25 Python
Python中相见恨晚的技巧
Apr 13 Python
Python开发五子棋小游戏
Apr 28 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仿盗链代码
2012/06/03 PHP
curl实现站外采集的方法和技巧
2014/01/31 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
编写简单的Python程序来判断文本的语种
2015/04/07 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
私人房屋买卖协议书
2014/10/04 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
如何在Python中创建二叉树
2021/03/30 Python