zoukankan      html  css  js  c++  java
  • Python的锁

    互斥锁
    # 锁通常被用来实现对共享资源的同步访问。为每一个共享资源创建一个Lock对象,
    l = Lock()#创建一个锁,初始状态是未锁定
    # 当你需要访问该资源时,调用l.acquire方法来获取锁对象
    # (如果其它线程已经获得了该锁,则当前线程需等待其被释放)
    # ,待资源访问完后,再调用l.release方法释放锁


    from threading import Thread,Lock,RLock
    import time
    def gg(A,B):
        A.acquire()
        time.sleep(0.5)
        print('hah拿到锁')
        B.acquire()
        print('hah拿到锁')
        A.release()
        B.release()
    def gg2(A,B):
        B.acquire()
        print('hah1拿到锁')
        A.acquire()
        print('hah1拿到锁')
        A.release()
        B.release()
    
    
    if __name__ == '__main__':
        # A = Lock()
        # B = Lock()
        # 解决死锁
        A =  B = RLock()  #每个递归锁都有自己的递归锁的计数器,
        t1 = Thread(target=gg,args=(A,B))
        t2 = Thread(target=gg2,args=(A,B))
        t1.start()
        t2.start()
    
    同一个递归锁,每碰到一个acquire 计数器加1
                        每碰道一个release计算器减1
    死锁现象与解决

     

    
    
    gil 锁
    # 在Cpython中,gil锁相当于锁定python解释器的锁,在同一个进程下可以开启多个线程,但是同一时刻只能有一个线程执行,无法利用多核技术
    #优势
    # 1. GIL本质就是一把互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,
    # 进而保证数据安全
    # 2.每运行一个Py文件文件都会对应产生一个独立的进程,在该进程内不仅有这个程序的主线程还开启了其他的线程
    # 还有解释器开启的垃圾回收等解释器级别的线程
    # GIL保护的是解释器级的数据,保护用户自己的数据则需要自己加锁处理
    # 进程可以利用多核,但是开销大,而python的多线程开销小,但却无法利用多核优势

    python解释器运行原理




     


  • 相关阅读:
    PHP中each与list用法分析
    三大范式通俗讲解
    数据库三大范式详解
    利用JS制作简便计算器
    CSS下拉列表错误纠正
    下拉列表
    CSS选择器、标签,div的位置。
    php注册审核
    php分页查询
    php投票练习
  • 原文地址:https://www.cnblogs.com/vivi0403/p/10060790.html
Copyright © 2011-2022 走看看