您好,登錄后才能下訂單哦!
資源總是有限的,程序運行如果對同一個對象進行操作,則有可能造成資源的爭用,甚至導致死鎖
也可能導致讀寫混亂
鎖提供如下方法:
1.Lock.acquire([blocking])
2.Lock.release()
3.threading.Lock() 加載線程的鎖對象,是一個基本的鎖對象,一次只能一個鎖定,其余鎖請求,需等待鎖釋放后才能獲取
4.threading.RLock() 多重鎖,在同一線程中可用被多次acquire。如果使用RLock,那么acquire和release必須成對出現,
調用了n次acquire鎖請求,則必須調用n次的release才能在線程中釋放鎖對象
例如:
無鎖:
#coding=utf8 import threading import time num = 0 def sum_num(i): global num time.sleep(1) num +=i print num print '%s thread start!'%(time.ctime()) try: for i in range(6): t =threading.Thread(target=sum_num,args=(i,)) t.start() except KeyboardInterrupt,e: print "you stop the threading" print '%s thread end!'%(time.ctime())
輸出:
Sun May 28 20:54:59 2017 thread start! Sun May 28 20:54:59 2017 thread end! 01 3 710 15
結果顯示混亂
引入鎖:
#coding=utf8 import threading import time num = 0 def sum_num(i): lock.acquire() global num time.sleep(1) num +=i print num lock.release() print '%s thread start!'%(time.ctime()) try: lock=threading.Lock() list = [] for i in range(6): t =threading.Thread(target=sum_num,args=(i,)) list.append(t) t.start() for threadinglist in list: threadinglist.join() except KeyboardInterrupt,e: print "you stop the threading" print '%s thread end!'%(time.ctime())
結果:
Sun May 28 21:15:37 2017 thread start! 0 1 3 6 10 15 Sun May 28 21:15:43 2017 thread end!
其中:
lock=threading.Lock()加載鎖的方法也可以換成lock=threading.RLock()
如果將上面的sum_num修改為:
lock.acquire() global num lock.acquire() time.sleep(1) num +=i lock.release() print num lock.release()
那么:
lock=threading.Lock() 加載的鎖,則一直處于等待中,鎖等待
而lock=threading.RLock() 運行正常
以上這篇對python多線程中Lock()與RLock()鎖詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。