当前位置: > python教程 > python多线程 >

python并发编程12--Rlock的使用
栏目分类:python多线程   发布日期:2019年03月11日 14:01:41   浏览次数:

        在系列文章11中讲解了Lock锁和Rlock锁的异同点,接下来我将介绍Rlock的作为递归锁的应用,也由此能看出递归锁大致用在什么样的场合中。
                                                           
1.背景

有个叫小红的普通面庞的女该,嗯,想改个洋气的名字,顺便整成一个魔鬼的面庞。嗯嗯...,发生了很多事之后,小红重回初心,又把名字改回,脸也整回来了。代码描述如下...:

import threading
class Person:
    def __init__(self, name, face='普通面庞'):
        self.name = name
        self.face = face
        self.__lock = threading.RLock()

    def set_name(self, new_name):
        with self.__lock:
            self.name = new_name

    def set_face(self, new_face):
        with self.__lock:
            self.face = new_face

    def set_both(self, new_name, new_face):
        with self.__lock:
            self.set_name(new_name)
            self.set_face(new_face)

if __name__ == '__main__':
    girl = Person('小红')
    print(girl.name, girl.face)
    girl.set_name('玛丽亚··菲斯特')
    girl.set_face('魔鬼面庞')
    print(girl.name, girl.face)
    girl.set_both('小红', '普通的面庞')
    print(girl.name, girl.face)
    '''
    小红 普通面庞
    玛丽亚··菲斯特 魔鬼面庞
    小红 普通的面庞
    '''
可以看到这些方法都是线程安全的,因为小红在改名和整容的时候不希望别人打扰。。。

2.修改
将Rlock修改为普通的Lock时,使用set_both方法,会发现程序是阻塞在set_name处,这是因为lock锁不能重复acquire的,从而产生了死锁的现象。

结语
    这只是一个简单的案例,但是也能看出当你需要重复申请锁且保障线程安全的时候,那么请使用RLock,并且RLock也能防止死锁的出现。但是,死锁并不是这么简单的问题,通常会出现在更复杂的情况中。


相关热词:

热门关键词
python字符串
     
python教程 python爬虫 python人工智能 Python+大数据 python问答