首頁 >後端開發 >Python教學 >如何使用python執行緒鎖(實例解析)

如何使用python執行緒鎖(實例解析)

乌拉乌拉~
乌拉乌拉~原創
2018-08-23 17:42:061787瀏覽

在這篇文章之中我們來了解一下什麼是python線程鎖定。了解python線程鎖的相關知識,以及線程鎖在python程式設計之中能起到什麼樣的作用。

線程鎖(互斥鎖Mutex)

一個行程下可以啟動多個線程,多個執行緒共享父進程的記憶體空間,也就意味著每個執行緒可以存取同一份數據,此時,如果2個執行緒同時要修改同一份數據,會出現什麼狀況?

鎖定的使用:

建立鎖定
mutex = threading.Lock()

鎖定
mutex.acquire([timeout ])

釋放
mutex.release()

import time

import threading

def addNum():
    global num #在每个线程中都获取这个全局变量
    print('--get num:',num )
    time.sleep(1)
    num  -=1 #对此公共变量进行-1操作
num = 100  #设定一个共享变量
thread_list = []
for i in range(100):
    t = threading.Thread(target=addNum)
    t.start()
    thread_list.append(t)
for t in thread_list: #等待所有线程执行完毕
    t.join()
    
print('final num:', num )

正常來講,這個num結果應該是0, 但在python 2.7上多運行幾次,會發現,最後打印出來的num結果不總是0,為什麼每次運行的結果不一樣?哈,很簡單,假設你有A,B兩個線程,此時都要對num 進行減1操作, 由於2個線程是並發同時運行的,所以2個線程很有可能同時拿走了num=100這個初始變數交給cpu去運算,當A執行緒去處完的結果是99,但此時B執行緒運算完的結果也是99,兩個執行緒同時CPU運算的結果再賦值給num變數後,結果就都是99。那怎麼辦呢?很簡單,每個線程在要修改公共數據時,為了避免自己在還沒改完的時候別人也來修改此數據,可以給這個數據加一把鎖, 這樣其它線程想修改此數據時就必須等待你修改完畢並把鎖釋放掉後才能再存取此資料。

註:不要在3.x上運行,不知為什麼,3.x上的結果總是正確的,可能是自動加了鎖

##以上就是本篇文章所講述的所有內容,這篇文章主要介紹了

python互斥鎖的相關知識,希望你能藉助資料從而理解上述所說的內容。希望我在這片文章所講述的內容能夠對你有幫助,讓你學習python更加輕鬆。

更多相關知識,請造訪php中文網

Python教學欄位。

以上是如何使用python執行緒鎖(實例解析)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn