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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                <del>當獲取線程鎖時,此線程獨占CPU資源 鎖主要用來解決資源競爭問題。 ### Lock鎖原語對象 下面的例子,數字順序變亂是其次;但如果,多個線程同時操作全局變量num會造成最終的結果小于10000。 同時生成10000個線程,線程生成后,運行瞬間結束,所以生成的數字順序是正常的, 顯示結果也是正常的。 當主線程還在生成下一個線程時,上一個子線程就已經結束了,所以不會有資源競爭。 ```python #!/usr/bin/env python # coding=utf-8 from threading import Thread, Lock from time import sleep num = 0 def add(): global num num += 1 print num lock = Lock() for i in range(10000): add_thread = Thread(target=add, args=()) add_thread.start() ``` 在線程中延遲了1秒,當主線程還在生成下一個線程時,上一個子線程還沒結束了,生成線程的速度遠快于線程結束的速度,造成資源競爭,數字順序變亂,結果不正常。 ```python from threading import Thread, Lock from time import sleep num = 0 def add(): global num sleep(1) num += 1 print num for i in range(10000): add_thread = Thread(target=add, args=()) add_thread.start() ``` --- 如果想解決上面的問題,可以在對全局變量進行造作時加鎖。 實際上,這種做法只能避免資源競爭,但是按順序輸出無法保證 ```python #!/usr/bin/env python # coding=utf-8 from threading import Thread, Lock from time import sleep num = 0 def add(): global num sleep(1) # 加鎖后,只有一個線程能獲得鎖,所以操作變量后立即釋放鎖 lock.acquire() num += 1 lock.release() print num # 生成鎖 lock = Lock() for i in range(10000): add_thread = Thread(target=add, args=()) add_thread.start() ``` --- ### 遞歸鎖RLock 使單一線程可以獲得已持有的鎖。 產生死鎖 說明: ```python #!/usr/bin/env python # coding=utf-8 from threading import Thread, Lock from time import sleep num = 0 num2 = 0 def add(): global num, num2 sleep(1) # 獲得一把鎖 lock.acquire() num += 1 # 等待自己的上一把鎖釋放,可是自己一直沒有釋放。 lock.acquire() num2 += 1 lock.release() lock.acquire() print (num,num2) # 生成鎖 lock = Lock() for i in range(10000): add_thread = Thread(target=add, args=()) add_thread.start() ``` 使用RLcok解決死鎖問題, RLock使單一線程能夠再次獲取自己的鎖 ```python #!/usr/bin/env python # coding=utf-8 from threading import Thread, RLock from time import sleep num = 0 num2 = 0 def add(): global num, num2 sleep(1) # 獲得一把鎖 lock.acquire() num += 1 # 獲得一把鎖 lock.acquire() num2 += 1 # 釋放兩次 lock.release() lock.release() print num,num2 # 生成鎖 lock = RLock() for i in range(10000): add_thread = Thread(target=add, args=()) add_thread.start() ``` ### 使用上下文管理器 使用上下文管理器,可以簡化代碼。進入該套件之前,上下文管理器會調用acquire()方法,并在完成后調用release()方法。 ~~~ #!/usr/bin/env python # coding=utf-8 #python2 from threading import Thread, RLock from time import sleep num = 0 num2 = 0 def add(): global num, num2 sleep(1) # 獲得一把鎖 with lock: num += 1 # 獲得一把鎖 with lock: num2 += 1 print num,num2 # 生成鎖 lock = RLock() for i in range(10000): add_thread = Thread(target=add, args=()) add_thread.start() ~~~
                  <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>

                              哎呀哎呀视频在线观看