国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python多線程死鎖現象及解決方法

89542767 / 501人閱讀

  小編寫這篇文章的一個主要目的,主要是來給大家進行闡述關于python多線程的問題一些問題解答,包括遇到多線程問題現象,那么,遇到這種現象的話,我們需要怎么去進行解答呢?下面小編就給大家詳細解答下。


  本節重點


  了解死鎖現象與解決方法


  本節時長需控制在15分鐘內


  一死鎖現象


  所謂死鎖:是指兩個或兩個以上的進程或線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。


  此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程,如下就是死鎖


  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()


  執行效果


  Thread-1拿到A鎖
  Thread-1拿到B鎖
  Thread-1拿到B鎖
  Thread-2拿到A鎖#出現死鎖,整個程序阻塞住


  二遞歸鎖


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


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


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


  from threading import Thread,RLock
  import time
  mutexA=mutexB=RLock()#一個線程拿到鎖,counter加1,該線程內又碰到加鎖的情況,則counter繼續加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()


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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128438.html

相關文章

  • 【Java并發編程的藝術】第一章讀書筆記

    摘要:前言并發編程的目的是讓程序跑的更快,但并不是啟動更多的線程,這個程序就跑的更快。盡可能降低上下文切換的次數,有助于提高并發效率。死鎖并發編程中的另一挑戰是死鎖,會造成系統功能不可用。 前言 并發編程的目的是讓程序跑的更快,但并不是啟動更多的線程,這個程序就跑的更快。有以下幾種挑戰。 挑戰及方案 上下文切換 單核CPU上執行多線程任務,通過給每個線程分配CPU時間片的方式來實現這個機制。...

    馬忠志 評論0 收藏0
  • 使用Python和Java調用Shell腳本時的死鎖陷阱

    摘要:一般使用或者調用外部腳本需要注意的是,這里的方向是相對于主程序的,所以就是子進程的輸出,而是子進程的輸入。基于同樣的原因,假如調用了方法等待子進程執行完畢而沒有及時處理輸出的話,就會造成死鎖。 最近有一項需求,要定時判斷任務執行條件是否滿足并觸發 Spark 任務,平時編寫 Spark 任務時都是封裝為一個 Jar 包,然后采用 Shell 腳本形式傳入所需參數執行,考慮到本次判斷條件...

    freewolf 評論0 收藏0
  • 使用Python和Java調用Shell腳本時的死鎖陷阱

    摘要:一般使用或者調用外部腳本需要注意的是,這里的方向是相對于主程序的,所以就是子進程的輸出,而是子進程的輸入。基于同樣的原因,假如調用了方法等待子進程執行完畢而沒有及時處理輸出的話,就會造成死鎖。 最近有一項需求,要定時判斷任務執行條件是否滿足并觸發 Spark 任務,平時編寫 Spark 任務時都是封裝為一個 Jar 包,然后采用 Shell 腳本形式傳入所需參數執行,考慮到本次判斷條件...

    wow_worktile 評論0 收藏0
  • Java鎖之重入鎖

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

    Jinkey 評論0 收藏0
  • 線程死鎖就是這么簡單

    摘要:此時線程需要鎖才能繼續往下執行。但是線程的鎖并沒有釋放,線程的鎖也沒有釋放。 前言 只有光頭才能變強 回顧前面: ThreadLocal就是這么簡單 多線程三分鐘就可以入個門了! 多線程基礎必要知識點!看了學習多線程事半功倍 Java鎖機制了解一下 AQS簡簡單單過一遍 Lock鎖子類了解一下 線程池你真不來了解一下嗎? 本篇主要是講解死鎖,這是我在多線程的最后一篇了。主要將多線程...

    winterdawn 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<