• python-线程互斥锁与递归锁


    1.线程跟进程里的互斥锁一样:

         将多个并发任务的部分代码(只涉及修改共享数据的代码,编程串行线程或进程操作)

         加锁可以保证多个进程修改同一数据,同一时间只能只要一个任务可以进行修改,这样可以保证数据的安全性,单牺牲了速度

    from threading import thread,lock
    
    import time
    
    mutex=lock()
    
    x=100
    
    def task():
    
        global x
    
        mutex.acquire()
    
        temp=x
    
        time.sleep(1)
    
        x=temp-1
    
        mutex.release()
    
    
    
    if __name__ =='__main__':
    
        t_l=[]
    
        start=time.time()
    
        for i in tange():
    
           t=thread(target=task)
    
            t_l.append(t)
    
            t.start()
        for t in t_l:
    
            t.join()
    
        shop=time.time()
    
        print(x,stop-start)

    递归锁:互斥锁一旦运用在多个修改共享数据的时候,会出现锁死的情况,所以这个时候需要用到递归锁

                特点:可以连续的acquire()

    from threading import Thread,Lock,active_count,RLock
    import time
    
    # mutexA=Lock()
    # mutexB=Lock()
    obj=RLock() #递归锁的特点:可以连续的acquire
    mutexA=obj
    mutexB=obj
    
    class Mythread(Thread):
        def run(self):
            self.f1()
            self.f2()
    
        def f1(self):
            mutexA.acquire()
            print('%s 拿到A锁' %self.name)
    
            mutexB.acquire()
            print('%s 拿到B锁' %self.name)
            mutexB.release()
    
            mutexA.release()
    
        def f2(self):
            mutexB.acquire()
            print('%s 拿到B锁' %self.name)
            time.sleep(1)
    
            mutexA.acquire()
            print('%s 拿到A锁' %self.name)
            mutexA.release()
    
            mutexB.release()
    
    if __name__ == '__main__':
        for i in range(10):
            t=Mythread()
            t.start()
        print(active_count())           #统计当前线程数#递归锁的特点:可以连续的acquire
    mutexA=obj
    mutexB=obj
    
    class Mythread(Thread):
        def run(self):
            self.f1()
            self.f2()
    
        def f1(self):
            mutexA.acquire()
            print('%s 拿到A锁' %self.name)
    
            mutexB.acquire()
            print('%s 拿到B锁' %self.name)
            mutexB.release()
    
            mutexA.release()
    
        def f2(self):
            mutexB.acquire()
            print('%s 拿到B锁' %self.name)
            time.sleep(1)
    
            mutexA.acquire()
            print('%s 拿到A锁' %self.name)
            mutexA.release()
    
            mutexB.release()
    
    if __name__ == '__main__':
        for i in range(10):
            t=Mythread()
            t.start()
        print(active_count())           #统计当前线程数

               

  • 相关阅读:
    认识弹性盒子
    管理Linux服务器的用户和组(续篇)
    管理Linux服务器的用户和组
    centos7 mysql数据库安装和配置
    熟练使用Linux进程管理类命令
    熟练使用Linux系统信息类命令
    Linux操作系统-基本命令(二)
    Linux操作系统-基本命令(一)
    api接口统一封装
    10分钟,让你彻底明白Promise原理
  • 原文地址:https://www.cnblogs.com/Marcki/p/10111926.html
Copyright © 2020-2023  润新知