91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

python多線程中互斥鎖與死鎖的示例分析

發布時間:2022-02-13 13:16:50 來源:億速云 閱讀:212 作者:小新 欄目:開發技術

小編給大家分享一下python多線程中互斥鎖與死鎖的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

一、多線程間的資源競爭

以下列task1()task2()兩個函數為例,分別將對全局變量num加一重復一千萬次循環(數據大一些,太小的話執行太快,達不到驗證的效果)。

import threading
import time

num = 0


def task1(nums):
    global num
    for i in range(nums):
        num += 1

    print("task1---num=%d" % num)


def task2(nums):
    global num
    for i in range(nums):
        num += 1
    print("task2---num=%d" % num)


if __name__ == '__main__':
    nums = 10000000
    t1 = threading.Thread(target=task1, args=(nums,))
    t2 = threading.Thread(target=task2, args=(nums,))

    t1.start()
    t2.start()
    # 因為主線程不會等子線程執行完就會執行,所以這里延遲五秒,確保最后執行。
    time.sleep(5)
    print("main----num=%d" % num)

程序運行結果:

python多線程中互斥鎖與死鎖的示例分析

如圖,輸出結果比較混亂,既沒有一千萬,最終結果也不是二千萬。因為多線程運行時出現了資源競爭,即可以理解為,每個函數運行的時間都不確定,且互相影響,
如從初始值0開始,假設t1的線程先執行,執行到+1后,此時的num=1還未存儲,然后即被叫停,t2開始執行,去獲取num,獲取到的num等于初始值0,然后其執行了+1并存儲,存儲后num=1,然后t2停止t1繼續,再次存儲num=1。即加了兩次1,但是num還是只等于1。
因為t1和t2誰來運行的分配是完全隨機的,所以最后加了兩千萬次1后值是小于2000萬的。

解決此類問題,可以使用到互斥鎖 。

二、互斥鎖

  • 某個線程要更改共享數據時,先將其鎖定,此時資源的狀態為"鎖定",其他線程不能改變,只到該線程釋放資源,將資源的狀態變成"非鎖定",其他的線程才能再次鎖定該資源。

  • 互斥鎖保證了每次只有一個線程進行寫入操作,從而保證了多線程情況下數據的正確性。

1.互斥鎖示例

創建一把鎖:

mutex = threading.Lock()
mutex.acquire() # 上鎖
xxxx鎖定的內容xxxxx
mutex.release() # 解鎖

將互斥鎖加入到上邊的代碼中如下,則問題得到了解決。

import threading
import time

num = 0


def task1(nums):
    global num
    mutex.acquire()
    for i in range(nums):
        num += 1
    mutex.release()
    print("task1---num=%d" % num)


def task2(nums):
    global num
    mutex.acquire()
    for i in range(nums):
        num += 1
    mutex.release()
    print("task2---num=%d" % num)


if __name__ == '__main__':
    nums = 10000000
    mutex = threading.Lock()
    t1 = threading.Thread(target=task1, args=(nums,))
    t2 = threading.Thread(target=task2, args=(nums,))

    t1.start()
    t2.start()
    # 因為主線程不會等子線程執行完就會執行,所以這里延遲五秒,確保最后執行。
    time.sleep(5)
    print("main----num=%d" % num)

程序運行結果:

python多線程中互斥鎖與死鎖的示例分析

2.可重入鎖與不可重入鎖

threading.Lock()上的是不可重入鎖,即一次只能加一把鎖,不能加多把。

threading.Lock()

如果需要同時加多把所,則需加入不可重入鎖

創建一把可重入鎖:

mutex = threading.RLock()
mutex.acquire() # 上鎖
mutex.acquire() # 再上鎖
xxxx鎖定的內容xxxxx
mutex.release() # 解鎖
mutex.release() # 再解鎖

其中上鎖和解鎖的次數必須保持一致。

三、死鎖

在線程間共享多個資源的時候,如果兩個線程分別占有一部分資源并且同時等待對方的資源,就會程序堵塞,造成死鎖。

  • 死鎖一般用不到。

  • 程序設計要盡量避免。

看完了這篇文章,相信你對“python多線程中互斥鎖與死鎖的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

夏津县| 台州市| 平昌县| 涿鹿县| 巴彦淖尔市| 阿拉善左旗| 安丘市| 玛多县| 兴山县| 太原市| 资源县| 介休市| 大余县| 靖远县| 梁山县| 平罗县| 沁源县| 进贤县| 玉山县| 阳朔县| 莱西市| 渝中区| 高雄市| 山西省| 蒙城县| 泗洪县| 明星| 改则县| 宁化县| 宁德市| 清镇市| 蓝山县| 万载县| 康保县| 溆浦县| 纳雍县| 宝兴县| 保亭| 孟州市| 金平| 新化县|