Python中threading模块的Lock和RLock区别详解

 更新时间:2023年09月22日 10:03:59   作者:生有涯,知无涯  
这篇文章主要介绍了Python中threading模块的Lock和RLock区别详解,Lock锁是Python的原始锁,在锁定时不属于任何一个线程,在调用了 lock.acquire() 方法后,进入锁定状态,lock.release()方法可以解锁,底层是通过一个函数来实现的,需要的朋友可以参考下

1.解释

1.1 Lock:

Lock锁是Python的原始锁,在锁定时不属于任何一个线程。在调用了 lock.acquire() 方法后,进入锁定状态,lock.release()方法可以解锁。

底层是通过一个函数来实现的,会根据不同的操作系统选择一个最有效的版本实例

1.2 RLock:

RLock被称为重入锁,RLock锁是一个可以被同一个线程多次 acquire 的锁,但是最后必须由获取它的线程来释放它,不论同一个线程调用了多少次的acquire,最后它都必须调用相同次数的 release 才能完全释放锁,这个时候其他的线程才能获取这个锁。

acquire()/release() 对可以嵌套,重入锁必须由获取它的线程释放。一旦线程获得了重入锁,同一个线程再次获取它将不阻塞。

RLock内部的锁的实现和Lock用的是同一个函数。

是否同一线程是否可重复加锁
Lock
RLock

2.示例

Lock在锁定时不属于特定线程,也就是说,Lock可以在一个线程中上锁,在另一个线程中解锁。

而对于RLock来说,只有当前线程才能释放本线程上的锁,即 解铃还须系铃人 :

import threading
import time
lock = threading.Lock()
lock.acquire()
def func():
    lock.release()
    print("lock is released")
t = threading.Thread(target=func)
t.start()

输出结果为:

lock is released

上面代码中,在主线程中创建锁,并上锁,但是是在t线程中释放锁,结果正常输出,说明一个线程上的锁,可以由另外线程解锁。如果把上面的锁改为RLock则报错。

RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。也就是说,下面的情况对于RLock是允许的:

import threading
rlock = threading.RLock()
def func():
    if rlock.acquire():   # 第一把锁
        print("first lock")
        if rlock.acquire():  # 第一把锁没解开的情况下接着上第二把锁
            print("second lock")
            rlock.release()  # 解开第二把锁
        rlock.release()  # 解开第一把锁
t = threading.Thread(target=func)
t.start()

输出结果

 first lock
 second lock

到此这篇关于Python中threading模块的Lock和RLock区别详解的文章就介绍到这了,更多相关threading模块的Lock和RLock内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python用pyinstaller封装exe双击后疯狂闪退解决办法

    python用pyinstaller封装exe双击后疯狂闪退解决办法

    本文主要介绍了python用pyinstaller封装exe双击后疯狂闪退解决办法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Python实现博客快速备份的脚本分享

    Python实现博客快速备份的脚本分享

    本文针对博客园实现了一个自动备份脚本,可以快速将自己的文章备份成Markdown格式的独立文件,备份后的md文件可以直接放入到hexo博客中,感兴趣的可以了解一下
    2022-09-09
  • Python中的并发处理之asyncio包使用的详解

    Python中的并发处理之asyncio包使用的详解

    本篇文章主要介绍了Python中的并发处理之asyncio包使用的详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Python中如何获取类属性的列表

    Python中如何获取类属性的列表

    这篇文章主要给大家介绍了在Python中如何获取类属性的列表,文中通过示例代码介绍的很详细,相信对大家的学习或者工作具有一定的参考借鉴价值,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用

    Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用

    csv文件是一种逗号分隔的纯文本形式存储的表格数据,Python内置了CSV模块,可直接通过该模块实现csv文件的读写操作,下面这篇文章主要给大家介绍了关于Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用,需要的朋友可以参考下
    2022-09-09
  • python常见数制转换实例分析

    python常见数制转换实例分析

    这篇文章主要介绍了python常见数制转换,实例分析了二进制、八进制、十进制及十六进制之间的相互转换技巧,需要的朋友可以参考下
    2015-05-05
  • Django 过滤器汇总及自定义过滤器使用详解

    Django 过滤器汇总及自定义过滤器使用详解

    这篇文章主要介绍了Django 过滤器汇总及自定义过滤器使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python使用pil进行图像处理(等比例压缩、裁剪)实例代码

    python使用pil进行图像处理(等比例压缩、裁剪)实例代码

    这篇文章主要介绍了python使用pil进行图像处理(等比例压缩、裁剪)实例代码,首先介绍了pil的相关内容,然后分享了实例代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Python图像处理之图像的灰度线性变换

    Python图像处理之图像的灰度线性变换

    这篇文章主要介绍了Python图像处理之图像的灰度线性变换,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 20个被低估的Python性能优化技巧分享

    20个被低估的Python性能优化技巧分享

    这篇文章主要为大家详细介绍了20个被低估的Python性能优化技巧并附上了实测数据,文中的示例代码简洁易懂,有需要的小伙伴可以参考一下
    2025-03-03

最新评论