对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 相关文章推荐
精确查找PHP WEBSHELL木马的方法(1)
Apr 12 Python
编写Python脚本来实现最简单的FTP下载的教程
May 04 Python
Python编程实现二叉树及七种遍历方法详解
Jun 02 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
Python 通过调用接口获取公交信息的实例
Dec 17 Python
Python字符串的全排列算法实例详解
Jan 07 Python
Python生成器的使用方法和示例代码
Mar 04 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
python中栈的原理及实现方法示例
Nov 27 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
如何在VSCode下使用Jupyter的教程详解
Jul 13 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 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简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
原生javaScript做得动态表格(注释写的很清楚)
2013/12/29 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
jQuery多项选项卡的实现思路附样式及代码
2014/06/03 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
python网络编程之文件下载实例分析
2015/05/20 Python
详解Django中Request对象的相关用法
2015/07/17 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
一套.net面试题及答案
2016/11/02 面试题
关于礼仪的演讲稿
2014/01/04 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
文明班级建设方案
2014/05/15 职场文书
校园文化标语
2014/06/18 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
background-position百分比原理详解
2021/05/08 HTML / CSS