您好,登錄后才能下訂單哦!
本篇文章為大家展示了Python中怎么實現一個線程鎖,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
每個線程互相獨立,相互之間沒有任何關系,但是在同一個進程中的資源,線程是共享的,如果不進行資源的合理分配,對數據造成破壞,使得線程運行的結果不可預期。這種現象稱為“線程不安全”。
線程同步能夠保證多個線程安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入一個狀態:鎖定/非鎖定。某個線程要更改共享數據時,先將其鎖定,此時資源的狀態為“鎖定”,其他線程不能更改;直到該線程釋放資源,將資源的狀態變成“非鎖定”,其他的線程才能再次鎖定該資源。互斥鎖保證了每次只有一個線程進行寫入操作,從而保證了多線程情況下數據的正確性。
threading模塊中定義了Lock類,可以方便的處理鎖定:
#創建鎖
mutex = threading.Lock()
#鎖定
mutex.acquire([timeout])#timeout是超時時間
#釋放
mutex.release()
其中,鎖定方法acquire可以有一個超時時間的可選參數timeout。如果設定了timeout,則在超時后通過返回值可以判斷是否得到了鎖,從而可以進行一些其他的處理。
# coding:utf-8
import threading
start_task = 0
task_num = 10000
mu = threading.Lock() ###通過工廠方法獲取一個新的鎖對象
class MyThread(threading.Thread): ##類MyThread繼承threading.Thread
def run(self): ## 線程啟動的入口函數,子類需要重寫
global start_task
global mu
global start_task
while start_task < task_num: ## 如果沒有任務,則繼續
if mu.acquire(): ## 加鎖
if start_task < task_num:
print start_task
start_task = start_task +1
mu.release() ##釋放鎖
def test():
thread_all =[]
for i in range(10): ##for循環創建6個線程
t = MyThread() ## 創建線程
thread_all.append(t)
t.start() ##啟動線程
for i in range(10):
thread_all[i].join() ##等待線程結束
if __name__== "__main__":
test()
在threading模塊中,定義兩種類型的瑣:threading.Lock和threading.RLock。它們之間有一點細微的區別,通過比較下面兩段代碼來說明:
import threading
lock = threading.Lock() #Lock對象
lock.acquire()
lock.acquire() #產生了死瑣。
lock.release()
lock.release()
import threading
rLock = threading.RLock() #RLock對象
rLock.acquire()
rLock.acquire() #在同一線程內,程序不會堵塞。
rLock.release()
rLock.release()
# coding:utf-8
import threading
lock = threading.RLock()
ret = lock.acquire(1)
print(ret)
ret = lock.acquire(3)
print(ret)
ret = lock.acquire(True)
print(ret)
ret = lock.acquire(False)
print(ret)
lock.release()
lock.release()
lock.release()
lock.release()
上述內容就是Python中怎么實現一個線程鎖,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。