你需要對多執行緒程式中的臨界區加鎖以避免競爭條件。例如只有一台印表機,但卻有兩個以上的輸入程式,這個時候印表機就是競爭資源。
如何解決,給印表機上鎖,使用印表機時上鎖,使用完解鎖。
在python中使用 threading 庫中的 lock 物件
用with語句,更加方便,自動獲取鎖,自動釋放,這樣可以避免忘記釋放
下面看例子:
import threading
import time
import random
class
printtest:
def__init__
(self):
self.lock_value=threading.lock()
defprint_001
(self):
while
true:
time.sleep(random.randint(1,4))
with self.lock_value:
print("001號正在使用印表機")
defprint_002
(self):
while
true:
time.sleep(random.randint(1, 4))
with self.lock_value:
print("002號正在使用印表機")
if __name__=='__main__':
p=printtest()
t1=threading.thread(target=p.print_001)
t2=threading.thread(target=p.print_002)
t1.setdaemon(true)
t2.setdaemon(true)
t1.start()
t2.start()
t1.join()
t2.join()
print("done")
執行結果:
001號正在使用印表機
002號正在使用印表機
002號正在使用印表機
002號正在使用印表機
001號正在使用印表機
002號正在使用印表機
001號正在使用印表機
002號正在使用印表機
002號正在使用印表機
002號正在使用印表機
001號正在使用印表機
順便介紹一下可重入鎖:
在 threading 庫中還提供了其他的同步原語,比如 rlock 和 semaphore 物件。但是根據以往經驗,這些原語是用於一些特殊的情況,如果你只是需要簡單地對可變物件進行鎖定,那就不應該使用它們。乙個 rlock (可重入鎖)可以被同乙個執行緒多次獲取,主要用來實現基於監測物件模式的鎖定和同步。在使用這種鎖的情況下,當鎖被持有時,只有乙個執行緒可以使用完整的函式或者類中的方法。比如,你可以實現乙個這樣的 sharedcounter 類:
import threading
class
sharedcounter:
''' a counter object that can be shared by multiple threads.
'''_lock = threading.rlock()
def__init__
(self, initial_value = 0):
self._value = initial_value
defincr
(self,delta=1):
''' increment the counter with locking
'''with sharedcounter._lock:
self._value += delta
defdecr
(self,delta=1):
''' decrement the counter with locking
'''with sharedcounter._lock:
self.incr(-delta)
Python學習筆記 多執行緒鎖
多執行緒的鎖 如果有多個執行緒同時操作乙個物件,如果沒有很好地保護該物件,會造成程式結果的不可預期 多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。因此需要用鎖threading.l...
python 多執行緒 鎖
參考 python cookbook 12章 啟動和停止執行緒 start 啟動執行緒 is alive 判斷是否已經結束 join 請求連線某個執行緒,等待該執行緒結束,才退出join函式 daemon引數,守護執行緒,該執行緒無法被連線,主線程結束後自動銷毀。2.7不適用 終止執行緒 需要自己構...
python多執行緒鎖 python的多執行緒程式設計之鎖
1 背景概述 在python中,要保證資料的正確性,並且自己對資料進行控制,對資料進行加鎖並且自己釋放鎖。多執行緒的主要目的為了提高效能與速度,用在無關的方向是最好的,例如在使用爬蟲的時候,可以使用多執行緒來進行爬取資料,因為在這些執行緒之間沒有需要共同操作的資料,從而在這個時候利用是最好的。如果需...