<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 功能強大 支持多語言、二開方便! 廣告
                [TOC] ## 引子 **進程是資源分配的最小單位,線程是CPU調度的最小單位,基于單線程來實現并發就引出了協程** >**對于單線程下,我們不可避免程序中出現io操作,但如果我們能在自己的程序中(即用戶程序級別,而非操作系統級別)控制單線程下的多個任務能在一個任務遇到io阻塞時就切換到另外一個任務去計算,這樣就保證了該線程能夠最大限度地處于就緒態,即隨時都可以被cpu執行的狀態,相當于我們在用戶程序級別將自己的io操作最大限度地隱藏起來,從而可以迷惑操作系統,讓其看到:該線程好像是一直在計算,io比較少,從而更多的將cpu的執行權限分配給我們的線程。** 協程的本質就是在單線程下,由用戶自己控制一個任務遇到io阻塞了就切換另外一個任務去執行,以此來提升效率。為了實現它,我們需要找尋一種可以同時滿足以下條件的解決方案: * 條件1: 可以控制多個任務之間的切換,切換之前將任務的狀態保存下來,以便重新運行時,可以基于暫停的位置繼續執行。 * 條件2 作為1的補充:可以檢測io操作,在遇到io操作的情況下才發生切換 ## 協程介紹 協程:是單線程下的并發,又稱微線程,纖程。英文名Coroutine:**協程是一種用戶態的輕量級線程,即協程是由用戶程序自己控制調度的。** **需要強調的是:** 1. python的線程屬于內核級別的,即由操作系統控制調度 (如單線程遇到io或執行時間過長就會被迫交出cpu執行權限,切換其他線程運行) 2. 單線程內開啟協程,一旦遇到io,就會從應用程序級別(而非操作系統)控制切換,以此來提升效率 (!!!非io操作的切換與效率無關) 對比操作系統控制線程的切換,用戶在單線程內控制協程的切換 **優點如下:** 1. 協程的切換開銷更小 屬于程序級別的切換,操作系統完全感知不到,因而更加輕量級 2. 單線程內就可以實現并發的效果,最大限度地利用cpu **缺點如下:** 1. 協程的本質是單線程下,無法利用多核 可以是一個程序開啟多個進程,每個進程內開啟多個線程,每個線程內開啟協程 2. 協程指的是單個線程,因而一旦協程出現阻塞,將會阻塞整個線程 ### 總結協程特點: 1. **必須在只有一個單線程里實現并發** 2. **修改共享數據不需加鎖** 3. **用戶程序里自己保存多個控制流的上下文棧** 4. **一個協程遇到IO操作自動切換到其它協程**
                  <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>

                              哎呀哎呀视频在线观看