在Python定時器中Lock的實(shí)際應(yīng)用操作方案詳解
Python定時器是計算機(jī)常用的計算機(jī)語言,在其廣泛的實(shí)際應(yīng)用操作中會涉及到Lock的實(shí)際應(yīng)用,如果你對Python定時器中Lock的實(shí)際應(yīng)用感興趣的話,你可以通過我們的文章對其有更深的了解。
在Python定時器中Lock的實(shí)際應(yīng)用
Lock/RLock 和 C# lock 關(guān)鍵字差不多意思。不同的是,Lock/RLock 只需 "鎖定" 自己,而 C# lock 還得另外找個引用類型對象。Lock 有個問題就是同一個線程內(nèi)部也不能多次 "鎖定",否則會死鎖。RLock 沒有這個問題,它會處理 "owning thread" 和 "recursion level" 狀態(tài),對于同一線程的多次請求鎖行為,只累加計數(shù)器。
每次調(diào)用 release() 將遞減該計數(shù)器,直到 0 時釋放鎖,因此記住 acquire() 和 release() 要成對出現(xiàn)。直接用 RLock,忘了 Lock 吧。
非鎖定版本:
- def test():
- for i in range(3):
- print currentThread().name, i
- sleep(1)
- for i in range(2):
- Thread(target = test).start()
輸出:
- $ ./main.py
- Thread-1 0
- Thread-2 0
- Thread-1 1
- Thread-2 1
- Thread-1 2
- Thread-2 2
鎖定版本:
- lock = RLock()
- def test():
- lock.acquire()
- try:
- for i in range(3):
- print currentThread().name, i
- sleep(1)
- finally:
- lock.release()
- for i in range(2):
- Thread(target = test).start()
輸出:
- $ ./main.py
- Thread-1 0
- Thread-1 1
- Thread-1 2
- Thread-2 0
- Thread-2 1
- Thread-2 2
RLock 實(shí)現(xiàn)了 Context Management Protocol,會自動調(diào)用 acquire() 和 release() 函數(shù),因此直接用 with/as 來實(shí)現(xiàn) C# "lock(o) { ... }"。
- lock = RLock()
- def test():
- with lock:
- for i in range(3):
- print currentThread().name, i
- sleep(1)
- for i in range(2):
- Thread(target = test).start()
【編輯推薦】