真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python中線程同步的作用是什么

Python中線程同步的作用是什么,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

站在用戶的角度思考問題,與客戶深入溝通,找到石城網(wǎng)站設(shè)計(jì)與石城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋石城地區(qū)。

假如兩個(gè)線程對(duì)象t1和t2都要對(duì)數(shù)值num=0進(jìn)行增1運(yùn)算,那么t1和t2都各對(duì)num修改10次的話,那么num最終的結(jié)果應(yīng)該為20。但是如果當(dāng)t1取得num的值時(shí)(假如此時(shí)num為0),系統(tǒng)把t1調(diào)度為“sleeping”狀態(tài),而此時(shí)t2轉(zhuǎn)換為“running”狀態(tài),此時(shí)t2獲得的num的值也為0,然后他把num+1的值1賦給num。系統(tǒng)又把t2轉(zhuǎn)化為“sleeping”狀態(tài),t1為“running”狀態(tài),由于t1已經(jīng)得到num值為0,所以他也把num+1的值賦給了num為1。本來是2次增1運(yùn)行,結(jié)果卻是num只增了1次。類似這樣的情況在多線程同時(shí)執(zhí)行的時(shí)候是有可能發(fā)生的。所以為了防止這類情況的出現(xiàn)就要使用Python線程同步機(jī)制。

最簡(jiǎn)單的同步機(jī)制就是“鎖”

鎖對(duì)象用threading.RLock類創(chuàng)建

mylock = threading.RLock()

如何使用鎖來Python線程同步呢?線程可以使用鎖的acquire() (獲得)方法,這樣鎖就進(jìn)入“l(fā)ocked”狀態(tài)。每次只有一個(gè)線程可以獲得鎖。如果當(dāng)另一個(gè)線程試圖獲得這個(gè)鎖的時(shí)候,就會(huì)被系統(tǒng)變?yōu)椤癰locked”狀態(tài),直到那個(gè)擁有鎖的線程調(diào)用鎖的release() (釋放)方法,這樣鎖就會(huì)進(jìn)入“unlocked”狀態(tài)。“blocked”狀態(tài)的線程就會(huì)收到一個(gè)通知,并有權(quán)利獲得鎖。如果多個(gè)線程處于“blocked”狀態(tài),所有線程都會(huì)先解除“blocked”狀態(tài),然后系統(tǒng)選擇一個(gè)線程來獲得鎖,其他的線程繼續(xù)沉默(“blocked”)。

import threading  mylock = threading.RLock()  class mythread(threading.Thread)  …  def run(self …):  … #此處 不可以 放置修改共享數(shù)據(jù)的代碼  mylock.acquire()  … #此處 可以 放置修改共享數(shù)據(jù)的代碼  mylock.release()  … #此處 不可以 放置修改共享數(shù)據(jù)的代碼

我們把修改共享數(shù)據(jù)的代碼稱為“臨界區(qū)”,必須將所有“臨界區(qū)”都封閉在同一鎖對(duì)象的acquire()和release()方法調(diào)用之間。

鎖只能提供最基本的同步級(jí)別。有時(shí)需要更復(fù)雜的線程同步,例如只在發(fā)生某些事件時(shí)才訪問一個(gè)臨界區(qū)(例如當(dāng)某個(gè)數(shù)值改變時(shí))。這就要使用“條件變量”。

條件變量用threading.Condition類創(chuàng)建

mycondition = threading.Condition()

條件變量是如何工作的呢?首先一個(gè)Python線程同步成功獲得一個(gè)條件變量后,調(diào)用此條件變量的wait()方法會(huì)導(dǎo)致這個(gè)線程釋放這個(gè)鎖,并進(jìn)入“blocked”狀態(tài),直到另一個(gè)線程調(diào)用同一個(gè)條件變量的notify()方法來喚醒那個(gè)進(jìn)入“blocked”狀態(tài)的線程。如果調(diào)用這個(gè)條件變量的notifyAll()方法的話就會(huì)喚醒所有的在等待的線程。

如果程序或者線程永遠(yuǎn)處于“blocked”狀態(tài)的話,就會(huì)發(fā)生死鎖。所以如果使用了鎖、條件變量等同步機(jī)制的話,一定要注意仔細(xì)檢查,防止死鎖情況的發(fā)生。對(duì)于可能產(chǎn)生異常的臨界區(qū)要使用異常處理機(jī)制中的finally子句來保證釋放鎖。等待一個(gè)條件變量的線程必須用notify()方法顯式的喚醒,否則就永遠(yuǎn)沉默。保證每一個(gè)wait()方法調(diào)用都有一個(gè)相對(duì)應(yīng)的notify()調(diào)用,當(dāng)然也可以調(diào)用notifyAll()方法以防萬(wàn)一。

關(guān)于Python中線程同步的作用是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


網(wǎng)頁(yè)名稱:Python中線程同步的作用是什么
當(dāng)前網(wǎng)址:http://weahome.cn/article/gipcgc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部