成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

python多線程死鎖現(xiàn)象及解決方法

89542767 / 510人閱讀

  小編寫(xiě)這篇文章的一個(gè)主要目的,主要是來(lái)給大家進(jìn)行闡述關(guān)于python多線程的問(wèn)題一些問(wèn)題解答,包括遇到多線程問(wèn)題現(xiàn)象,那么,遇到這種現(xiàn)象的話,我們需要怎么去進(jìn)行解答呢?下面小編就給大家詳細(xì)解答下。


  本節(jié)重點(diǎn)


  了解死鎖現(xiàn)象與解決方法


  本節(jié)時(shí)長(zhǎng)需控制在15分鐘內(nèi)


  一死鎖現(xiàn)象


  所謂死鎖:是指兩個(gè)或兩個(gè)以上的進(jìn)程或線程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。


  此時(shí)稱(chēng)系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱(chēng)為死鎖進(jìn)程,如下就是死鎖


  from threading import Thread,Lock
  import time
  mutexA=Lock()
  mutexB=Lock()
  class MyThread(Thread):
  def run(self):
  self.func1()
  self.func2()
  def func1(self):
  mutexA.acquire()
  print('33[41m%s拿到A鎖33[0m'%self.name)
  mutexB.acquire()
  print('33[42m%s拿到B鎖33[0m'%self.name)
  mutexB.release()
  mutexA.release()
  def func2(self):
  mutexB.acquire()
  print('33[43m%s拿到B鎖33[0m'%self.name)
  time.sleep(2)
  mutexA.acquire()
  print('33[44m%s拿到A鎖33[0m'%self.name)
  mutexA.release()
  mutexB.release()
  if __name__=='__main__':
  for i in range(10):
  t=MyThread()
  t.start()


  執(zhí)行效果


  Thread-1拿到A鎖
  Thread-1拿到B鎖
  Thread-1拿到B鎖
  Thread-2拿到A鎖#出現(xiàn)死鎖,整個(gè)程序阻塞住


  二遞歸鎖


  解決方法,遞歸鎖,在Python中為了支持在同一線程中多次請(qǐng)求同一資源,python提供了可重入鎖RLock。


  這個(gè)RLock內(nèi)部維護(hù)著一個(gè)Lock和一個(gè)counter變量,counter記錄了acquire的次數(shù),從而使得資源可以被多次require。直到一個(gè)線程所有的acquire都被release,其他的線程才能獲得資源。


  上面的例子如果使用RLock代替Lock,則不會(huì)發(fā)生死鎖,二者的區(qū)別是:遞歸鎖可以連續(xù)acquire多次,而互斥鎖只能acquire一次


  from threading import Thread,RLock
  import time
  mutexA=mutexB=RLock()#一個(gè)線程拿到鎖,counter加1,該線程內(nèi)又碰到加鎖的情況,則counter繼續(xù)加1,這期間所有其他線程都只能等待,等待該線程釋放所有鎖,即counter遞減到0為止
  class MyThread(Thread):
  def run(self):
  self.func1()
  self.func2()
  def func1(self):
  mutexA.acquire()
  print('33[41m%s拿到A鎖33[0m'%self.name)
  mutexB.acquire()
  print('33[42m%s拿到B鎖33[0m'%self.name)
  mutexB.release()
  mutexA.release()
  def func2(self):
  mutexB.acquire()
  print('33[43m%s拿到B鎖33[0m'%self.name)
  time.sleep(2)
  mutexA.acquire()
  print('33[44m%s拿到A鎖33[0m'%self.name)
  mutexA.release()
  mutexB.release()
  if __name__=='__main__':
  for i in range(10):
  t=MyThread()
  t.start()


  綜上所述,這篇內(nèi)容就給大家介紹到這里了,希望可以給各位讀者帶來(lái)幫助。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/128438.html

相關(guān)文章

  • 【Java并發(fā)編程的藝術(shù)】第一章讀書(shū)筆記

    摘要:前言并發(fā)編程的目的是讓程序跑的更快,但并不是啟動(dòng)更多的線程,這個(gè)程序就跑的更快。盡可能降低上下文切換的次數(shù),有助于提高并發(fā)效率。死鎖并發(fā)編程中的另一挑戰(zhàn)是死鎖,會(huì)造成系統(tǒng)功能不可用。 前言 并發(fā)編程的目的是讓程序跑的更快,但并不是啟動(dòng)更多的線程,這個(gè)程序就跑的更快。有以下幾種挑戰(zhàn)。 挑戰(zhàn)及方案 上下文切換 單核CPU上執(zhí)行多線程任務(wù),通過(guò)給每個(gè)線程分配CPU時(shí)間片的方式來(lái)實(shí)現(xiàn)這個(gè)機(jī)制。...

    馬忠志 評(píng)論0 收藏0
  • 使用Python和Java調(diào)用Shell腳本時(shí)的死鎖陷阱

    摘要:一般使用或者調(diào)用外部腳本需要注意的是,這里的方向是相對(duì)于主程序的,所以就是子進(jìn)程的輸出,而是子進(jìn)程的輸入?;谕瑯拥脑颍偃缯{(diào)用了方法等待子進(jìn)程執(zhí)行完畢而沒(méi)有及時(shí)處理輸出的話,就會(huì)造成死鎖。 最近有一項(xiàng)需求,要定時(shí)判斷任務(wù)執(zhí)行條件是否滿(mǎn)足并觸發(fā) Spark 任務(wù),平時(shí)編寫(xiě) Spark 任務(wù)時(shí)都是封裝為一個(gè) Jar 包,然后采用 Shell 腳本形式傳入所需參數(shù)執(zhí)行,考慮到本次判斷條件...

    freewolf 評(píng)論0 收藏0
  • 使用Python和Java調(diào)用Shell腳本時(shí)的死鎖陷阱

    摘要:一般使用或者調(diào)用外部腳本需要注意的是,這里的方向是相對(duì)于主程序的,所以就是子進(jìn)程的輸出,而是子進(jìn)程的輸入?;谕瑯拥脑颍偃缯{(diào)用了方法等待子進(jìn)程執(zhí)行完畢而沒(méi)有及時(shí)處理輸出的話,就會(huì)造成死鎖。 最近有一項(xiàng)需求,要定時(shí)判斷任務(wù)執(zhí)行條件是否滿(mǎn)足并觸發(fā) Spark 任務(wù),平時(shí)編寫(xiě) Spark 任務(wù)時(shí)都是封裝為一個(gè) Jar 包,然后采用 Shell 腳本形式傳入所需參數(shù)執(zhí)行,考慮到本次判斷條件...

    wow_worktile 評(píng)論0 收藏0
  • Java鎖之重入鎖

    摘要:通過(guò)關(guān)鍵字可以實(shí)現(xiàn)多線程之間的同步控制,除了上述方法,為我們提供了很多并發(fā)控制的工具類(lèi),今天主要講的就是中的重入鎖,效果基本等同于關(guān)鍵字。 在講重入鎖之前,我們先看一段代碼showImg(https://segmentfault.com/img/bV0FmF?w=1198&h=878);上述代碼想要實(shí)現(xiàn)的效果,就是使用兩個(gè)線程對(duì)i分別進(jìn)行累加一百萬(wàn)次,最終希望i的值是二百萬(wàn),如果按照上...

    Jinkey 評(píng)論0 收藏0
  • 線程死鎖就是這么簡(jiǎn)單

    摘要:此時(shí)線程需要鎖才能繼續(xù)往下執(zhí)行。但是線程的鎖并沒(méi)有釋放,線程的鎖也沒(méi)有釋放。 前言 只有光頭才能變強(qiáng) 回顧前面: ThreadLocal就是這么簡(jiǎn)單 多線程三分鐘就可以入個(gè)門(mén)了! 多線程基礎(chǔ)必要知識(shí)點(diǎn)!看了學(xué)習(xí)多線程事半功倍 Java鎖機(jī)制了解一下 AQS簡(jiǎn)簡(jiǎn)單單過(guò)一遍 Lock鎖子類(lèi)了解一下 線程池你真不來(lái)了解一下嗎? 本篇主要是講解死鎖,這是我在多線程的最后一篇了。主要將多線程...

    winterdawn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<