zoukankan      html  css  js  c++  java
  • 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())           #统计当前线程数

               

  • 相关阅读:
    详细聊聊k8s deployment的滚动更新(一)
    更新k8s镜像版本的三种方式
    深入理解docker信号机制以及dumb-init的使用
    10分钟教你理解反射
    nodejs的交互式解释器模式常用命令
    nrm的安装和使用
    复杂sql语句之单字段分类count计数和多字段count计数
    navicat连接mysql出现2059
    mongodb常规操作语句
    System.Web.NullPointerException
  • 原文地址:https://www.cnblogs.com/Marcki/p/10111926.html
Copyright © 2011-2022 走看看