新聞中心
Python定時(shí)器是計(jì)算機(jī)常用的計(jì)算機(jī)語(yǔ)言,在其廣泛的實(shí)際應(yīng)用操作中會(huì)涉及到Lock的實(shí)際應(yīng)用,如果你對(duì)Python定時(shí)器中Lock的實(shí)際應(yīng)用感興趣的話,你可以通過我們的文章對(duì)其有更深的了解。

在Python定時(shí)器中Lock的實(shí)際應(yīng)用
Lock/RLock 和 C# lock 關(guān)鍵字差不多意思。不同的是,Lock/RLock 只需 "鎖定" 自己,而 C# lock 還得另外找個(gè)引用類型對(duì)象。Lock 有個(gè)問題就是同一個(gè)線程內(nèi)部也不能多次 "鎖定",否則會(huì)死鎖。RLock 沒有這個(gè)問題,它會(huì)處理 "owning thread" 和 "recursion level" 狀態(tài),對(duì)于同一線程的多次請(qǐng)求鎖行為,只累加計(jì)數(shù)器。
每次調(diào)用 release() 將遞減該計(jì)數(shù)器,直到 0 時(shí)釋放鎖,因此記住 acquire() 和 release() 要成對(duì)出現(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,會(huì)自動(dòng)調(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()
本文題目:在Python定時(shí)器中Lock的實(shí)際應(yīng)用操作方案詳解
文章URL:http://fisionsoft.com.cn/article/dhioodd.html


咨詢
建站咨詢
