<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] **多進程好多線程都有死鎖的問題** ## 一 死鎖現象 所謂死鎖: 是指兩個或兩個以上的進程或線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程, ### 死鎖案例-科學家吃面問題 ~~~ import time from threading import Thread,Lock def eat1(name,fork_lock,noodle_lock): fork_lock.acquire() #拿叉子鎖 print('%s拿到叉子了'%name) noodle_lock.acquire() #拿面條鎖 print('%s拿到面條了' % name) print('%s吃面'%name) noodle_lock.release() #釋放面條鎖 fork_lock.release() #釋放叉子鎖 def eat2(name,fork_lock,noodle_lock): noodle_lock.acquire() print('%s拿到面條了' % name) time.sleep(1) fork_lock.acquire() print('%s拿到叉子了' % name) print('%s吃面'%name) fork_lock.release() noodle_lock.release() fork_lock = Lock() noodle_lock = Lock() Thread(target=eat1,args=('alex',fork_lock,noodle_lock)).start() Thread(target=eat2,args=('wusir',fork_lock,noodle_lock)).start() ~~~ **執行效果** ~~~ alex拿到叉子了 alex拿到面條了 alex吃面 wusir拿到面條了 yuan拿到叉子了 #出現死鎖,整個程序阻塞住 ~~~ ## 二 遞歸鎖 解決方法,遞歸鎖,在Python中為了支持在同一線程中多次請求同一資源,python提供了可重入鎖RLock。 這個RLock內部維護著一個Lock和一個counter變量,counter記錄了acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源。 ### 遞歸鎖解決吃面問題 ~~~ import time from threading import Thread,RLock def eat1(name,fork_lock,noodle_lock): fork_lock.acquire() print('%s拿到叉子了'%name) noodle_lock.acquire() print('%s拿到面條了' % name) print('%s吃面'%name) noodle_lock.release() fork_lock.release() def eat2(name,fork_lock,noodle_lock): noodle_lock.acquire() print('%s拿到面條了' % name) time.sleep(1) fork_lock.acquire() print('%s拿到叉子了' % name) print('%s吃面'%name) fork_lock.release() noodle_lock.release() fork_lock =noodle_lock = RLock() #一個線程拿到鎖,counter加1,該線程內又碰到加鎖的情況,則counter繼續加1, #這期間所有其他線程都只能等待,等待該線程釋放所有鎖,即counter遞減到0為止 Thread(target=eat1,args=('alex',fork_lock,noodle_lock)).start() Thread(target=eat2,args=('wusir',fork_lock,noodle_lock)).start() Thread(target=eat1,args=('yuan',fork_lock,noodle_lock)).start() ~~~ 執行結果: ``` alex拿到叉子了 alex拿到面條了 alex吃面 wusir拿到面條了 wusir拿到叉子了 wusir吃面 yuan拿到叉子了 yuan拿到面條了 yuan吃面 Process finished with exit code 0 ``` ## 互斥鎖和遞歸鎖的區別 互斥鎖在同一個線程中連續acquire一次以上就會死鎖 遞歸鎖在同一個線程中可以連續的acquire多次而不發生死鎖 * 普遍說法 : 遞歸鎖可以代替互斥鎖來解決死鎖現象 * 實際上 : 遞歸鎖的解決死鎖實際上是犧牲了時間和空間的 **死鎖從本質上來講是一種邏輯錯** **遞歸鎖沒有從根本上解決死鎖問題**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看