Python入门学习笔记13(线程锁与信号量)
生活随笔
收集整理的這篇文章主要介紹了
Python入门学习笔记13(线程锁与信号量)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
鎖的作用是在多個(gè)線程訪問同一個(gè)資源時(shí)對資源進(jìn)行保護(hù),防止多線程操作造成結(jié)果不解預(yù)測
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.可重入鎖
可重入鎖是用來解決循環(huán)加鎖造成的死鎖問題。
互斥鎖連續(xù)上鎖兩次以上便會(huì)陷入死鎖狀態(tài),如果要使用同一把鎖進(jìn)行多次鎖操作,必須使用可重入鎖RLock。
RLock中維護(hù)了一個(gè)Lock對象和一個(gè)counter,counter中記錄了鎖acquire的次數(shù),使得可以對鎖進(jìn)行多次的acquire操作。
只有在所有的acquire被release之后,其他線程才能夠獲得資源。
#如果使用了Lock便會(huì)死鎖 # 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.信號(hào)量
互斥鎖同時(shí)允許一個(gè)線程訪問資源,而信號(hào)量同時(shí)允許一組線程訪問資源。
連接池就是信號(hào)量的運(yùn)用。
import threading import time #一個(gè)最大為5的信號(hào)量 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()從運(yùn)行結(jié)果可以看出,持續(xù)會(huì)維持在同時(shí)最多只有5個(gè)線程可以進(jìn)行訪問,當(dāng)有信號(hào)量release了才會(huì)用新的進(jìn)程遞補(bǔ)
?
轉(zhuǎn)載于:https://www.cnblogs.com/Hexdecimal/p/9407559.html
總結(jié)
以上是生活随笔為你收集整理的Python入门学习笔记13(线程锁与信号量)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx服务应用
- 下一篇: 关于爬虫的日常复习(8)—— 实战:re