对python多线程中Lock()与RLock()锁详解

 更新时间:2019年01月11日 10:13:04   作者:comprel  
今天小编就为大家分享一篇对python多线程中Lock()与RLock()锁详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源的争用,甚至导致死锁

也可能导致读写混乱

锁提供如下方法:

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 selenium自动化测试框架搭建的方法步骤

    python selenium自动化测试框架搭建的方法步骤

    这篇文章主要介绍了python selenium自动化测试框架搭建的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • python安装numpy和pandas的方法步骤

    python安装numpy和pandas的方法步骤

    这篇文章主要介绍了python安装numpy和pandas的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Python中多线程及程序锁浅析

    Python中多线程及程序锁浅析

    这篇文章主要介绍了Python中多线程及程序锁浅析,本文用一个实例讲解Python的多线程和程序锁,需要的朋友可以参考下
    2015-01-01
  • Python使用matplotlib绘制余弦的散点图示例

    Python使用matplotlib绘制余弦的散点图示例

    这篇文章主要介绍了Python使用matplotlib绘制余弦的散点图,涉及Python操作matplotlib的基本技巧与散点的设置方法,需要的朋友可以参考下
    2018-03-03
  • 关于python中导入文件到list的问题

    关于python中导入文件到list的问题

    这篇文章主要介绍了关于python中导入文件到list的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 利用Python自动生成PPT的示例详解

    利用Python自动生成PPT的示例详解

    在日常工作中,PPT制作是常见的工作。这篇文章主要为大家详细介绍了如何利用Python自动生成PPT,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-07-07
  • django 将自带的数据库sqlite3改成mysql实例

    django 将自带的数据库sqlite3改成mysql实例

    这篇文章主要介绍了django 将自带的数据库sqlite3改成mysql实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 关于python DataFrame的合并方法总结

    关于python DataFrame的合并方法总结

    这篇文章主要介绍了关于python DataFrame的合并方法总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 简单讲解Python中的字符串与字符串的输入输出

    简单讲解Python中的字符串与字符串的输入输出

    这篇文章主要介绍了Python中的字符串与字符串的输入输出,Python3.x版本中默认以Unicode为编码,省去了不少麻烦,需要的朋友可以参考下
    2016-03-03
  • 用python实现一个文件搜索工具

    用python实现一个文件搜索工具

    大家好,本篇文章主要讲的是用python实现一个搜索工具,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论