对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 19 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
python虚拟环境完美部署教程
Aug 06 Python
python装饰器代替set get方法实例
Dec 19 Python
Python如何把十进制数转换成ip地址
May 25 Python
10个示例带你掌握python中的元组
Nov 23 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 Python
Python 中面向接口编程
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 字符串替换的方法
2012/01/10 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
round robin权重轮循算法php实现代码
2016/05/28 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
jquery validate使用攻略 第四步
2010/07/01 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
JavaScript 对象模型 执行模型
2010/10/15 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
python比较2个xml内容的方法
2015/05/11 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
python实现杨辉三角思路
2017/07/14 Python
python在非root权限下的安装方法
2018/01/23 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
Python日志syslog使用原理详解
2020/02/18 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
销售员自我评价怎么写
2013/09/19 职场文书
园林施工员岗位职责
2013/12/11 职场文书
献爱心标语
2014/06/21 职场文书
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js