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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ### 背景介紹 #### 并發和并行 程序同一進程中線程在一顆CPU上`交替執行`,這樣可以實現`并發`。 程序的不同進程分別在多核CPU上`同時執行`,這樣可以實現`并行`。 ### 什么是進程? 計算機程序只不過是磁盤中可執行的,二進制(或其它類型)的數據。它們只有在被讀取到內存中,被操作系統調用的時候才開始它們的生命期。進程(有時被稱為`重量級進程`)是程序的一次執行。每個進程都有自己的`地址空間`,`內存`,`數據棧`以及其它記錄其運行軌跡的`輔助數據`。操作系統管理在其上運行的所有進程,并為這些進程`公平`地分配時間。 進程也可以通過fork或者spawn派生新的進程來執行任務,每個進程都有自己的內存空間和數據棧,所以只能采取`進程間通信`(IPC)共享信息。 >* 進程間公平的分配時間片 >* 進程間不能共享內存 ### 什么是線程? 線程(有時被稱為`輕量級進程`)跟進程有些相似,不同的是,所有的線程運行在同一個進程中,共享相同的運行環境。我們可以想像成是在主進程或“主線程”中并行運行的“迷你進程”。 >* 線程間不公平的分配時間片 >* 線程間能共享內存,交換數據 >* 線程是CPU執行的最小單元 ### 為什么要使用線程? 大多數的應用程序如果在開發時考慮采用兩個以上線程,那么一般情況下是為每個線程分配了獨立的功能,且這些功能能夠`“并發地"`執行。 點對點的聊天工具,需要在我們編寫信息的同時能夠接受并打印出來對方說的話。如果將信息的發送和接受放在一個線程里,線程的單一順序控制流程特性就使得發送和接受兩者不能兼顧。其實說到“并發地”,實際上,這兩個線程并不是同時在執行,而是`相斥`地,但是由于計算機的數據處理能力很強大,能夠把系統資源快速地在這兩者之間進行調配(切換),以至于我們人感覺不到這個切換的過程,好像它是在并發地執行,也就是說計算機通過多線程提供的所謂“并發性”滿足了程序使用者對于并發性的要求。 ### 什么時候使用多線程,什么時候使用多進程? 在python的原始解釋器CPython中存在著GIL(`Global Interpreter Lock`,全局解釋器鎖),因此在解釋執行python代碼時,會產生互斥鎖來限制線程對共享資源的訪問,直到解釋器遇到`I/O操作`或者`操作次數`達到一定數目時才會釋放GIL。所以,雖然CPython的線程庫直接封裝了系統的原生線程,但CPython整體作為一個進程,同一時間只會有一個獲得GIL的線程在跑,其他線程則處于等待狀態。這就造成了即使在多核CPU中,多線程也只是做著分時切換而已。 因為Python的多線程不能調用多個核心,只能利用一個核心. 如果是IO密集帶阻塞的任務,Python的多線程還是很不錯的. 如果是CPU密集, 試試多進程好了。 #### GIL的作用 在執行一些sleep/read/write/recv/send這些會導致阻塞的函數時,當前線程會主動放棄GIL,然后調用相應的系統API,完成后再重新申請GIL。因此,GIL也并不是導致Python的多線程完全沒用,在一些IO等待的場合,Python多線程還是發揮了作用,當然如果多線程都是用于CPU密集的代碼,那多線程的執行效率就明顯會比單線程的低。 ### 鎖 線程的通關文牒 當線程遇到需要獲取鎖的時候,能獲取則通過,獲取不到則阻塞在那里,直到獲取鎖或者一直獲取不到;如果在西游中,鎖就像是通關文牒,能拿到則通過,拿不到則通不過。 ### 阻塞 阻塞是卡在無法繼續運行后續的代碼。被阻塞的線程是沒有順序的,并不是先到先到先執行,勝出的線程是不確定的。
                  <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>

                              哎呀哎呀视频在线观看