对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从零实现贝叶斯分类器的机器学习的教程
Mar 31 Python
Python入门教程之运算符与控制流
Aug 17 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
解决Python对齐文本字符串问题
Aug 28 Python
Pycharm 2020年最新激活码(亲测有效)
Sep 18 Python
Python 中@property的用法详解
Jan 15 Python
python中with用法讲解
Feb 07 Python
python 画图 图例自由定义方式
Apr 17 Python
Pycharm生成可执行文件.exe的实现方法
Jun 02 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
python给list排序的简单方法
Dec 10 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
ThinkPHP采用模块和操作分析
2011/04/18 PHP
有关php运算符的知识大全
2011/11/03 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
angular 服务随记小结
2019/05/06 Javascript
vue 组件简介
2020/07/31 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python中的条件判断语句基础学习教程
2016/02/07 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
2014端午节活动策划方案
2014/01/27 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
离婚协议书范本样本
2014/08/19 职场文书
教师党员个人总结
2015/02/10 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL