对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系列之从文件读取和保存数据
May 23 Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 Python
基于python log取对数详解
Jun 08 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
Aug 07 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
Dec 31 Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 Python
python爬虫使用scrapy注意事项
Nov 23 Python
20行代码教你用python给证件照换底色的方法示例
Feb 05 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 登录记住密码实现思路
2013/05/07 PHP
Linux下PHP安装mcrypt扩展模块笔记
2014/09/10 PHP
php数组指针操作详解
2017/02/14 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
python 提取文件的小程序
2009/07/29 Python
python抓取网页中链接的静态图片
2018/01/29 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
Python if语句知识点用法总结
2018/06/10 Python
python之信息加密题目详解
2019/06/26 Python
利用python求积分的实例
2019/07/03 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
python实现取余操作的简单实例
2020/08/16 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
幼儿园优秀教师事迹
2014/02/13 职场文书
上班玩手机检讨书
2014/02/17 职场文书
党员公开承诺书
2014/03/25 职场文书
作风建设年活动总结
2014/08/27 职场文书
委托证明书
2014/09/17 职场文书
大学生自荐材料范文
2014/12/30 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
聊聊redis-dump工具安装问题
2022/01/18 Redis