码迷,mamicode.com
首页 > 编程语言 > 详细

线程_锁

时间:2020-03-29 10:47:05      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:thread   一个   %s   count   sleep   产生   map   nbsp   print   

(1)死锁

        是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

        此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁

       

#死锁
from threading import Thread,Lock,current_thread
import time
class MyThread(Thread):
    def run(self):
        self.f1()
        self.f2()
    def f1(self):
        mutexA.acquire()
        print("%s 抢到A锁" %current_thread().getName())
        mutexB.acquire()
        print("%s 抢到B锁" %current_thread().getName())
        print("%s 释放B锁" %current_thread().getName())
        mutexB.release()
        print("%s 释放A锁" %current_thread().getName())
        mutexA.release()
        
    def f2(self):
        mutexB.acquire()
        print("%s 抢到B锁" %current_thread().getName())
        time.sleep(1)
        mutexA.acquire()
        print("%s 抢到A锁" %current_thread().getName())
        print("%s 释放A锁" %current_thread().getName())
        mutexA.release()
        print("%s 释放B锁" %current_thread().getName())
        mutexB.release()
        
if __name__=="__main__":
    mutexA=Lock()
    mutexB=Lock()
    for i in range(20):
        t=MyThread()
        t.start()
# ‘‘‘
# Thread-758 抢到A锁
# Thread-758 抢到B锁
# Thread-758 释放B锁
# Thread-758 释放A锁
# Thread-758 抢到B锁
# Thread-759 抢到A锁
# ‘‘‘

 

 

(2)递归锁

      RLock内部维护着一个Lock和一个counter变量,

      counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。

     上面的例子如果使用RLock代替Lock,则不会发生死锁:

    

from threading import Thread,RLock,current_thread
import time
class MyThread(Thread):
    def run(self):
        self.f1()
        self.f2()
    def f1(self):
        mutex.acquire()
        print("%s 抢到锁" %current_thread().getName())
        mutex.acquire()
        print("%s 抢到锁" %current_thread().getName())
        print("%s 释放锁" %current_thread().getName())
        mutex.release()
        print("%s 释放锁" %current_thread().getName())
        mutex.release()
        
    def f2(self):
        mutex.acquire()
        print("%s 抢到锁" %current_thread().getName())
        time.sleep(1)
        mutex.acquire()
        print("%s 抢到锁" %current_thread().getName())
        print("%s 释放锁" %current_thread().getName())
        mutex.release()
        print("%s 释放锁" %current_thread().getName())
        mutex.release()
        
if __name__=="__main__":
    mutex=RLock()
    for i in range(20):
        t=MyThread()
        t.start()
‘‘‘
Thread-808 抢到锁
Thread-808 抢到锁
Thread-808 释放锁
Thread-808 释放锁
Thread-810 抢到锁
Thread-810 抢到锁
Thread-810 释放锁
Thread-810 释放锁

‘‘‘

 

       

(3)信号量  

       Semaphore管理一个内置的计数器,每当调用acquire()时内置计数器-1;调用release() 时内置计数器+1;       

      计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。

      实例:(同时只有5个线程可以获得semaphore,即可以限制最大连接数为5):

      

#线程:信号量【锁】

from threading import Thread,current_thread,Semaphore
import time,random
sm=Semaphore(3)
def work():
    sm.acquire()
    print("target %s is running" %current_thread().getName())
    time.sleep(random.randint(1,3))
    sm.release()
    
if __name__=="__main__":
    for i in range(10):        
        t=Thread(target=work)    
        t.start()

 

线程_锁

标签:thread   一个   %s   count   sleep   产生   map   nbsp   print   

原文地址:https://www.cnblogs.com/hapyygril/p/12590796.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!