1. 程式人生 > >python-執行緒互斥鎖與遞迴鎖

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()) #統計當前執行緒數