<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上的執行單位。 * **多線程:** 在一個進程中存在多個線程,多個線程共享該進程的地址空間,相當于一個車間內有多條流水線,都共用一個車間的資源。 ### 線程與進程的區別 1. 同一個進程內的多個線程共享該進程內的地址資源 2. 創建線程的開銷要遠小于創建進程的開銷 創建一個進程,就是創建一個車間,涉及到申請空間,而且在該空間內建至少一條流水線 但創建線程,就只是在一個車間內造一條流水線,無需申請空間,所以創建開銷小 ### 線程與進程總結 1. **線程是計算機中能被CPU調度的最小單位** 2. **進程是計算機中資源分派的最小單位** 3. **每一個進程中至少有一個線程** * 多線程的特點 并發的、輕量級、數據不隔離 * 多進程的特點 并發的、操作比較笨重、數據完全隔離 ## 全局解釋器鎖GIL 在Cpython解釋器中,同一個進程下開啟的多線程,同一時刻只能有一個線程執行,無法利用多核優勢 GIL本質就是一把互斥鎖,既然是互斥鎖,所有互斥鎖的本質都一樣,都是將并發運行變成串行,以此來控制同一時間內共享數據只能被一個任務所修改,進而保證數據安全。 ### GIL與Lock 鎖的目的是為了保護共享的數據,同一時間只能有一個線程來修改共享的數據,保護不同的數據就應該加不同的鎖。 GIL 與Lock是兩把鎖,保護的數據不一樣,前者是解釋器級別的(當然保護的就是解釋器級別的數據,比如垃圾回收的數據),后者是保護用戶自己開發的應用程序的數據,很明顯GIL不負責這件事,只能用戶自定義加鎖處理,即Lock,如下圖 ![enter description here](https://www.github.com/noah-luo/imags/raw/master/year/1551406460359.png) 分析: ~~~ 1、100個線程去搶GIL鎖,即搶執行權限 2、肯定有一個線程先搶到GIL(如線程1),然后開始執行,一旦執行就會拿到lock.acquire() 3、極有可能線程1還未運行完畢,就有另外一個線程2搶到GIL并開始運行 但線程2發現互斥鎖lock還未被線程1釋放,于是阻塞,被迫交出執行權限,即釋放GIL 4、直到線程1重新搶到GIL,開始從上次暫停的位置繼續執行,直到正常釋放互斥鎖lock 然后其他的線程再重復2 3 4的過程 ~~~ ### GIL與多線程 有了GIL的存在,同一時刻同一進程中只有一個線程被執行; 對計算來說,cpu越多越好,但是對于I/O來說,再多的cpu也沒用 所以我們只能相對的去看一個程序到底是計算密集型還是I/O密集型,然后在確定使用多線程還是多進程 * **多進程與多線程分析** 假設我們有四個任務需要處理,處理方式肯定是要玩出并發的效果,解決方案可以是: 方案一:多進程方案:開啟四個進程 方案二:多線程方案:開啟四個線程 * **單核情況下,分析結果:** 如果四個任務是計算密集型,沒有多核來并行計算,方案一徒增了創建進程的開銷,方案二勝 如果四個任務是I/O密集型,方案一創建進程的開銷大,且進程的切換速度遠不如線程,方案二勝 * **多核情況下,分析結果:** 如果四個任務是計算密集型,多核意味著并行計算,在python中一個進程中同一時刻只有一個線程執行用不上多核,方案一勝 如果四個任務是I/O密集型,再多的核也解決不了I/O問題,方案二勝 * **結論:** 多線程用于IO密集型,如socket,爬蟲,web 多進程用于計算密集型,如金融分析
                  <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>

                              哎呀哎呀视频在线观看