• 线程锁lock&rlock


    首先关于锁:

    1  使用锁会影响性能

    2  锁可能谁导致死锁

    比如:

    线程A acquire a 等待b

    线程B acquire b 等待a

    这种资源竞争就会导致死锁

    【Lock】

    lock 不能连续获取两次(死锁了), 因为第二个锁会一直等待第一个释放

    【Rlock】

    可重入锁 Rlock 在同一个线程里面可以连续acquire多次,一定要注意acquire和releae 次数相等

    其实主要就是对于你的线程处理中会有一些比较复杂的代码逻辑过程,比如很多层的函数调用,而这些函数其实都需要进行加锁保护数据访问。
    这样就可能会反复的多次加锁,因而用rlock就可以进行多次加锁,解锁,直到最终锁被释放
    而如果用普通的lock,当你一个函数A已经加锁,它内部调用另一个函数B,如果B内部也会对同一个锁加锁,那么这种情况就也会导致死锁。而rlock可以解决这个问题.

    下面的demo中如果使用Lock,则会陷入死锁中

    import threading
    
    lock = threading.RLock()
    info=dict()
    def make_name():
        lock.acquire()
        info["name"] = "zhangsan"
        make_age()
        lock.release()
    
    def make_age():
        lock.acquire()
        info["age"] = 20
        lock.release()
    
    t = threading.Thread(target=make_name)
    t.start()
    t.join()
    print(info)
  • 相关阅读:
    有些文件不需要配置,只需要放到resources下面
    RAFT算法
    HBase,region以及HFile概念
    GitHub搭建个人网站续
    sublime text 2 安装emmet插件
    前端收录
    Zepto
    将复杂form表单序列化serialize-object.js
    PHP 清除HTML代码、空格、回车换行符的函数
    Yii2 选择布局的方式
  • 原文地址:https://www.cnblogs.com/jkklearn/p/14223906.html
Copyright © 2020-2023  润新知