对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实现list元素按关键字相加减的方法示例
Jun 09 Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 Python
python 实现登录网页的操作方法
May 11 Python
python 列表输出重复值以及对应的角标方法
Jun 11 Python
PyTorch中常用的激活函数的方法示例
Aug 20 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 Python
在Tensorflow中实现梯度下降法更新参数值
Jan 23 Python
Python中的xlrd模块使用原理解析
May 21 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
Jun 03 Python
TensorFlow中tf.batch_matmul()的用法
Jun 02 Python
详解Flask开发技巧之异常处理
Jun 15 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 命令行参数详解及应用
2011/05/18 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
javascript中的一些注意事项 更新中
2010/12/06 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
JavaScript操作Cookie详解
2015/02/28 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
python计算日期之间的放假日期
2018/06/05 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
postman传递当前时间戳实例详解
2019/09/14 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
John Hardy官方网站:手工设计首饰的奢侈品牌
2017/07/05 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
会计学个人自荐信模板
2013/12/13 职场文书
农场厂长岗位职责
2013/12/28 职场文书
酒店中秋节促销方案
2014/01/30 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
旷工辞退通知书
2015/04/17 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
股权投资协议书
2016/03/23 职场文书
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python