对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抓取某汽车网数据解析html存入excel示例
Dec 04 Python
python传递参数方式小结
Apr 17 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
使用python为mysql实现restful接口
Jan 05 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python小项目之五子棋游戏
Dec 26 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
python中return不返回值的问题解析
Jul 22 Python
通过实例解析Python文件操作实现步骤
Sep 21 Python
如何利用python读取micaps文件详解
Oct 18 Python
python 实现汉诺塔游戏
Nov 28 Python
pyx文件 生成pyd 文件用于 cython调用的实现
Mar 04 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注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
PHP里的单例类写法实例
2015/06/25 PHP
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
详解AngularJS中module模块的导入导出
2015/12/10 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
2016/02/19 Javascript
jQuery实现的省市县三级联动菜单效果完整实例
2016/08/01 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
PHP webshell检查工具 python实现代码
2009/09/15 Python
python实现井字棋游戏
2020/03/30 Python
python cumsum函数的具体使用
2019/07/29 Python
python 连续不等式语法糖实例
2020/04/15 Python
python学习笔记之多进程
2020/08/06 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
软件测试企业面试试卷
2016/07/13 面试题
网吧收银员岗位职责
2013/12/14 职场文书
班级课外活动总结
2014/07/09 职场文书
法院授权委托书范文
2014/08/02 职场文书
企业投资意向书
2015/05/09 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA