对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数据结构之二叉树的建立实例
Apr 29 Python
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 Python
Python多线程编程(八):使用Event实现线程间通信
Apr 05 Python
python3大文件解压和基本操作
Dec 15 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
Feb 26 Python
python 字典中取值的两种方法小结
Aug 02 Python
pybind11和numpy进行交互的方法
Jul 04 Python
PyTorch的SoftMax交叉熵损失和梯度用法
Jan 15 Python
python入门:argparse浅析 nargs='+'作用
Jul 12 Python
Python实现GIF图倒放
Jul 16 Python
Python开发入门——迭代的基本使用
Sep 03 Python
Python深度学习之Pytorch初步使用
May 20 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获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
php组合排序简单实现方法
2016/10/15 PHP
详解php中空字符串和0之间的关系
2016/10/23 PHP
php防止sql注入的方法详解
2017/02/20 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
调试php程序的简单步骤
2019/10/04 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
面试常见的js算法题
2017/03/23 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
javascript实现摄像头拍照预览
2019/09/30 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
Python3里的super()和__class__使用介绍
2015/04/23 Python
Python如何实现文本转语音
2016/08/08 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
python将时分秒转换成秒的实例
2019/12/07 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
医学专业五年以上个人求职信
2013/12/03 职场文书
建筑专业自荐信范文
2014/01/05 职场文书
物理专业大学生职业生涯规划书
2014/02/07 职场文书
村庄绿化方案
2014/05/07 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
2015年煤矿工作总结
2015/04/28 职场文书