当前位置: 首页 > 编程笔记 >

详解Python中的Lock和Rlock

刘和正
2023-03-14
本文向大家介绍详解Python中的Lock和Rlock,包括了详解Python中的Lock和Rlock的使用技巧和注意事项,需要的朋友参考一下

线程是进程中可以调度执行的实体。而且,它是操作系统中可以执行的最小处理单元。简单地说,一个线程就是一个程序中可以独立于其他代码执行的指令序列。为了简单起见,你可以假设线程只是进程的子集!

Locks

锁是Python中用于同步的最简单的方式。锁有两种状态:上锁、释放锁。

锁是线程模块中的一个类,有两个主要方法:acquire()和release() 当调用acquire()方法时,它锁定锁的执行并阻塞锁的执行,直到其他线程调用release()方法将其设置为解锁状态。锁帮助我们有效地访问程序中的共享资源,以防止数据损坏,它遵循互斥,因为一次只能有一个线程访问特定的资源。

让我们看看下面的例子来理解锁的使用:

import threading
 
#创建一个lock对象
lock = threading.Lock()
 
#初始化共享资源
abce = 0
 
def sumOne():
    global abce
 
    #锁定共享资源
    lock.acquire()
    abce = abce + 1
 
    #释放共享资源
    lock.release()
 
def sumTwo():
    global abce
 
    #锁定共享资源
    lock.acquire()
    abce = abce + 2
 
    #释放共享资源
    lock.release()
 
#调用函数
 
sumOne()
sumTwo()
print(abce)

在上面的程序中,lock是一个锁对象,全局变量abce是一个共享资源,sumOne()和sumTwo()函数扮作两个线程,在sumOne()函数中共享资源abce首先被锁定,然后增加了1,然后abce被释放。sumTwo()函数执行类似操作。 两个函数sumOne()和sumTwo()不能同时访问共享资源abce,一次只能一个访问共享资源。

RLocks

默认的lock不能识别lock当前被哪个线程持有。如果任何线程正在访问共享资源,那么试图访问共享资源的其他线程将被阻塞,即使锁定共享资源的线程也是如此。 在这些情况下,可重入锁(或RLock)用于防止访问共享资源时出现不必要的阻塞。如果共享资源在RLock中,那么可以安全地再次调用它。 RLocked资源可以被不同的线程重复访问,即使它在被不同的线程调用时仍然可以正常工作。

让我们看看下面的例子来理解RLocks的使用:

import threading
 
#创建一个lock对象
lock = threading.Lock()
 
#初始化共享资源
abce = 0
 
#本线程访问共享资源
lock.acquire()
abce = abce + 1
 
#这个线程访问共享资源会被阻塞
lock.acquire()
abce = abce + 2
lock.release()
 
print(abce)

在上面的程序中,两个线程同时尝试访问共享资源abce,这里当一个线程当前正在访问共享资源abce时,另一个线程将被阻止访问它。 当两个或多个线程试图访问相同的资源时,有效地阻止了彼此访问该资源,这就是所谓的死锁,因此上述程序没有生成任何输出。

但是,在程序中上述问题可以通过使用RLock来解决。

import threading
 
#创建一个rlock对象
lock = threading.RLock()
 
#初始化共享资源
abce = 0
 
#本线程访问共享资源
lock.acquire()
abce = abce + 1
 
#这个线程尝试访问共享资源
lock.acquire()
abce = abce + 2
lock.release()
 
print(abce)

在这里,没有阻止程序中的线程访问共享资源abce。 对于RLock对象锁的每个acquire(),我们需要调用release()一次。

从上面提到的众多程序和解释中,在Python中一个Lock对象和一个RLock对象有很多区别:

locks rlocks
lock对象无法再被其他线程获取,除非持有线程释放 rlock对象可以被其他线程多次获取
lock对象可被任何线程释放 rlock对象只能被持有的线程释放
lock对象不可以被任何线程拥有 rlock对象可以被多个线程拥有
对一个对象锁定是很快的 对一个对象加rlock比加lock慢

以上就是详解Python中的Lock和Rlock的详细内容,更多关于Python中Lock和Rlock的资料请关注小牛知识库其它相关文章!

 类似资料:
  • 本文向大家介绍Python中__init__和__new__的区别详解,包括了Python中__init__和__new__的区别详解的使用技巧和注意事项,需要的朋友参考一下 __init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候。例如: 这样便是__init__最普通的用法了。但

  • 本文向大家介绍详解python中的json和字典dict,包括了详解python中的json和字典dict的使用技巧和注意事项,需要的朋友参考一下 定义 python中,json和dict非常类似,都是key-value的形式,而且json、dict也可以非常方便的通过dumps、loads互转。既然都是key-value格式,为啥还需要进行格式转换? json(JavaScript Object

  • 本文向大家介绍C++11 并发指南之Lock 详解,包括了C++11 并发指南之Lock 详解的使用技巧和注意事项,需要的朋友参考一下 在 《 C++11 并发指南三(std::mutex 详解) 》一文中我们主要介绍了 C++11 标准中的互斥量(Mutex),并简单介绍了一下两种锁类型。本节将详细介绍一下 C++11 标准的锁类型。 C++11 标准为我们提供了两种基本的锁类型,分别如下: s

  • 本文向大家介绍Python中的变量和作用域详解,包括了Python中的变量和作用域详解的使用技巧和注意事项,需要的朋友参考一下 作用域介绍 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量; E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的; G:globa,全局变量,就是模块级别定义的变量; B:built-i

  • 本文向大家介绍对Python中Iterator和Iterable的区别详解,包括了对Python中Iterator和Iterable的区别详解的使用技巧和注意事项,需要的朋友参考一下 Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器。为什么? 因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的,也就是说有多少

  • 本文向大家介绍对python中的argv和argc使用详解,包括了对python中的argv和argc使用详解的使用技巧和注意事项,需要的朋友参考一下 主要问题 为什么argv中第一个,即index=0的内容就是文件名? python中argc是用什么实现的? 概念解释 argc:argument counter,命令行参数个数 argv:argument vector,命令行参数向量(内容) 通