php 线程锁,如何使用python线程锁(实例解析)
在這篇文章之中我們來了解一下什么是python線程鎖。了解一下python線程鎖的相關(guān)知識,以及線程鎖在python編程之中能起到什么樣的作用。
線程鎖(互斥鎖Mutex)
一個(gè)進(jìn)程下可以啟動(dòng)多個(gè)線程,多個(gè)線程共享父進(jìn)程的內(nèi)存空間,也就意味著每個(gè)線程可以訪問同一份數(shù)據(jù),此時(shí),如果2個(gè)線程同時(shí)要修改同一份數(shù)據(jù),會(huì)出現(xiàn)什么狀況?
鎖的使用:
創(chuàng)建鎖
mutex = threading.Lock()
鎖定
mutex.acquire([timeout])
釋放
mutex.release()import time
import threading
def addNum():
global num #在每個(gè)線程中都獲取這個(gè)全局變量
print('--get num:',num )
time.sleep(1)
num -=1 #對此公共變量進(jìn)行-1操作
num = 100 #設(shè)定一個(gè)共享變量
thread_list = []
for i in range(100):
t = threading.Thread(target=addNum)
t.start()
thread_list.append(t)
for t in thread_list: #等待所有線程執(zhí)行完畢
t.join()
print('final num:', num )
正常來講,這個(gè)num結(jié)果應(yīng)該是0, 但在python 2.7上多運(yùn)行幾次,會(huì)發(fā)現(xiàn),最后打印出來的num結(jié)果不總是0,為什么每次運(yùn)行的結(jié)果不一樣呢? 哈,很簡單,假設(shè)你有A,B兩個(gè)線程,此時(shí)都 要對num 進(jìn)行減1操作, 由于2個(gè)線程是并發(fā)同時(shí)運(yùn)行的,所以2個(gè)線程很有可能同時(shí)拿走了num=100這個(gè)初始變量交給cpu去運(yùn)算,當(dāng)A線程去處完的結(jié)果是99,但此時(shí)B線程運(yùn)算完的結(jié)果也是99,兩個(gè)線程同時(shí)CPU運(yùn)算的結(jié)果再賦值給num變量后,結(jié)果就都是99。那怎么辦呢? 很簡單,每個(gè)線程在要修改公共數(shù)據(jù)時(shí),為了避免自己在還沒改完的時(shí)候別人也來修改此數(shù)據(jù),可以給這個(gè)數(shù)據(jù)加一把鎖, 這樣其它線程想修改此數(shù)據(jù)時(shí)就必須等待你修改完畢并把鎖釋放掉后才能再訪問此數(shù)據(jù)。
注:不要在3.x上運(yùn)行,不知為什么,3.x上的結(jié)果總是正確的,可能是自動(dòng)加了鎖
以上就是本篇文章所講述的所有內(nèi)容,這篇文章主要介紹了python互斥鎖的相關(guān)知識,希望你能借助資料從而理解上述所說的內(nèi)容。希望我在這片文章所講述的內(nèi)容能夠?qū)δ阌兴鶐椭?#xff0c;讓你學(xué)習(xí)python更加輕松。
更多相關(guān)知識,請?jiān)L問php中文網(wǎng)Python教程欄目。
總結(jié)
以上是生活随笔為你收集整理的php 线程锁,如何使用python线程锁(实例解析)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php数字加零,php实现数字补零的两种
- 下一篇: php api数据,php API查询