中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中怎么實現一個線程鎖

發布時間:2021-07-05 15:04:37 來源:億速云 閱讀:191 作者:Leah 欄目:大數據

本篇文章為大家展示了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中怎么實現一個線程鎖,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永泰县| 休宁县| 通江县| 茌平县| 东安县| 通州市| 大港区| 乡城县| 上林县| 平遥县| 伊吾县| 长沙市| 中宁县| 东台市| 南澳县| 大城县| 东海县| 海宁市| 泸溪县| 琼海市| 宣恩县| 龙州县| 淮安市| 濮阳市| 贵溪市| 沂源县| 齐河县| 牡丹江市| 连州市| 石城县| 山西省| 彩票| 金塔县| 江孜县| 于都县| 且末县| 元阳县| 平湖市| 满城县| 京山县| 芮城县|