对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 相关文章推荐
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
python中zip和unzip数据的方法
May 27 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
浅谈Python中的私有变量
Feb 28 Python
解决Python网页爬虫之中文乱码问题
May 11 Python
selenium在执行phantomjs的API并获取执行结果的方法
Dec 17 Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 Python
Python IDLE或shell中切换路径的操作
Mar 09 Python
Python中关于logging模块的学习笔记
Jun 03 Python
Sentry错误日志监控使用方法解析
Nov 12 Python
python中if嵌套命令实例讲解
Feb 25 Python
10个顶级Python实用库推荐
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中创建和调用webservice接口示例
2014/07/25 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
php简单smarty入门程序实例
2015/06/11 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
小程序实现列表点赞功能
2018/11/02 Javascript
javascript实现滚动条效果
2020/03/24 Javascript
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
PyQt 线程类 QThread使用详解
2017/07/16 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
详解python运行三种方式
2019/05/13 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
keras slice layer 层实现方式
2020/06/11 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
《故都的秋》教学反思
2014/04/15 职场文书
青春无悔演讲稿
2014/05/08 职场文书
男方婚礼答谢词
2015/01/20 职场文书
小石潭记导游词
2015/02/03 职场文书
预备党员转正意见
2015/06/01 职场文书
2016十一国庆节感言
2015/12/09 职场文书
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS