对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测试驱动开发实例
Oct 08 Python
Python中的各种装饰器详解
Apr 11 Python
Python抓取框架 Scrapy的架构
Aug 12 Python
Python实现的单向循环链表功能示例
Nov 10 Python
python实现批量图片格式转换
Jun 16 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
pandas 时间格式转换的实现
Jul 06 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
Aug 07 Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
Jan 13 Python
常用的10个Python实用小技巧
Aug 10 Python
python绘图pyecharts+pandas的使用详解
Dec 13 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
摘自织梦CMS中的图片处理类
2015/08/08 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
Python脚本实现代码行数统计代码分享
2015/03/10 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
python文件读取失败怎么处理
2020/06/23 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
巴西最大的珠宝连锁店:Vivara
2019/04/18 全球购物
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
毕业证丢失证明
2014/01/15 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
中专毕业生的自荐书
2014/07/01 职场文书
督导岗位职责
2015/02/04 职场文书
重温入党誓词主持词
2015/06/29 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
JS的深浅复制详细
2021/10/16 Javascript