Python入门学习笔记13(线程锁与信号量)
生活随笔
收集整理的這篇文章主要介紹了
Python入门学习笔记13(线程锁与信号量)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鎖的作用是在多個線程訪問同一個資源時對資源進行保護,防止多線程操作造成結果不解預測
1.互斥鎖
import threadingnum = 0mutex = threading.Lock();def cal(i):#上鎖mutex.acquire()global numnum += i#解鎖mutex.release()lst = [] for i in range(5):t = threading.Thread(target=cal,args=(i,))lst.append(t)t.start()for t in lst:t.join() print(num)2.可重入鎖
可重入鎖是用來解決循環加鎖造成的死鎖問題。
互斥鎖連續上鎖兩次以上便會陷入死鎖狀態,如果要使用同一把鎖進行多次鎖操作,必須使用可重入鎖RLock。
RLock中維護了一個Lock對象和一個counter,counter中記錄了鎖acquire的次數,使得可以對鎖進行多次的acquire操作。
只有在所有的acquire被release之后,其他線程才能夠獲得資源。
#如果使用了Lock便會死鎖 # mutex = threading.Lock(); mutex = threading.RLock();num = 0def plus():mutex.acquire()print("plus lock")global numnum += 1mutex.release()print("plus release")def mimus():mutex.acquire()print("mimus lock")global numnum -= 1mutex.release()print("mimus release")def run():mutex.acquire()plus()print("-----------")mimus()mutex.release()for i in range(5):t = threading.Thread(target=run)t.start()3.信號量
互斥鎖同時允許一個線程訪問資源,而信號量同時允許一組線程訪問資源。
連接池就是信號量的運用。
import threading import time #一個最大為5的信號量 semaphore = threading.BoundedSemaphore(5)def func(i):semaphore.acquire()print("member%d訪問" %i)time.sleep(i)semaphore.release()for i in range(20):t= threading.Thread(target = func,args = (i,))t.start()從運行結果可以看出,持續會維持在同時最多只有5個線程可以進行訪問,當有信號量release了才會用新的進程遞補
?
轉載于:https://www.cnblogs.com/Hexdecimal/p/9407559.html
總結
以上是生活随笔為你收集整理的Python入门学习笔记13(线程锁与信号量)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx服务应用
- 下一篇: 关于爬虫的日常复习(8)—— 实战:re