<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 功能強大 支持多語言、二開方便! 廣告
                ## 同步、異步 ![](http://cdn.aipin100.cn/0d0894963f36bf906531aab82e52212b) 本文不直接講同步、異步、阻塞、非阻塞、串行、并行、并發的概念理論,而是試圖從多個方面討論來幫助你理解。 >[danger] **以下討論如沒有特別說明,所說的程序都是指的線程(最小粒度的執行實例 / 程序執行流的最小單元),這樣才準確,才有現實意義。** [PHP socket初探 --- 關于IO的一些枯燥理論](https://blog.ti-node.com/blog/6389362802519179264) > 同步,異步,阻塞,非阻塞,甚至是同步阻塞,同步非阻塞,異步阻塞,異步非阻塞.是不是暈了?截至到目前為止,你可以簡單地認為只要搞明白這幾個名詞的含義以及區別,就算弄明白IO了,至少了可以繼續往下看了. > 如果你仔細品過上面案例中的每一個字,你就能慢慢體會到之所以異步和非阻塞,同步和阻塞容易混淆,僅僅是因為二者的表現形式稍微有點兒相似而已. > > **阻塞和非阻塞關注的是:** 在等饅頭的過程中,你在干啥. > **同步和異步關注的是:** 等饅頭這件事,你是一直等到"饅頭出爐"的結果,還是立即跑路等阿梅告訴你的"饅頭出爐".重點的是你是如何得知"饅頭出爐"的. > > 所以現實世界中,最傻的人才會采用異步阻塞的IO方式去寫程序(**等的過程不能干別的,另外結果還得通過別人獲知。**).其余三種方式,更多的人都會選擇同步阻塞或者異步非阻塞.同步非阻塞最大的問題在于,你需要不斷在各個任務中忙碌著,導致你的大腦混亂,非常累. > > ***** ### 1. IO模型 從程序處理IO的方式來看,有以下關系: | | **同步** | **異步** | |---|---|---| | **阻塞** | 同步阻塞 | 異步阻塞 | | **非阻塞** | 同步非阻塞 | 異步非阻塞 | **名詞解釋:** | 名詞 | 解釋 | |---|---| | **阻塞** | 例:A調用B,在B返回前,A除了一直等著之外,什么都做不了 | | **非阻塞** | 例:A調用B,在B返回前,A還可以做別的 | | **同步** | 自己得到結果;調用方依賴被調用方返回的結果 | | **異步** | 不是自己直接得到結果;調用方不依賴被調用方返回的結果 | ***** ### 2. 執行順序 從程序的執行順序上來看,兩個相關的程序有兩種順序關系: | 名詞 | 解釋 | |---|---| | **串行** | 指兩個線程的執行順序是有先后關系的 | | **并行** | 指兩個線程的執行順序關系是同時執行的 | > 注意:在單核CPU上的并行其實是一種假象(由于進程切換太快,讓我們幾乎感覺不到,誤以為是同時執行的),但我們理解為兩個程序在同一刻執行也沒有什么錯。在多核CPU上存在真正的并行,不過也無法嚴格證明。(由于時間刻度可以無限細分,對于同時的概念沒有絕對的,不絕對準確的理解也沒有錯,這就是理論上存在,但是卻無法證明) ***** ### 3. 從對外提供服務上來看 **并發:** 如果一個系統可以同時為多人提供服務,或者能同時提供多種服務,那么此系統就是一個支持并發的系統,反之就不算是一個支持并發的系統。(**這里的 “能同時為多人提供服務” 并不是指多個用戶的操作要在同時進行**) ATM機就不是一個并發系統,Apache和Nginx就是支持并發的系統,并發能力也是有極限的,這點請查閱相應系統的配置。 [高并發的那點事兒](https://mp.weixin.qq.com/s/n9FnQq2K93JTTr1kMkwJaw) > 如果一個系統支持兩個或多個動作(Action)同時存在,那就是一個并發系統,如一個秒殺商城,可以同時支持大量的下單處理。如果一個系統支持兩個或多個動作同時執行,那就是一個并行系統,如一個多線程爬蟲。 [漫話:如何給女朋友解釋為什么雙11無法修改收貨地址](https://mp.weixin.qq.com/s/En4Tv_32TLz_WpmWJfuM_g) >[danger] **排隊中的用戶也是并發用戶。** 如果一個系統能同時服務多個用戶,那就是一個支持并發的系統, **這個服務并不是指多個用戶的操作要在同時進行。** 多個操作同時進行,稱之為并行系統。 ***** 至此,我們已經從三個方面討論了:同步、異步、阻塞、非阻塞、串行、并行、并發,相信對于程序的執行細節,你比以往都有更清晰的理解了(建議結合 [IO模型 · php筆記 · 看云](http://www.hmoore.net/xiak/php-node/786007) 一起閱讀效果會更好)。 ***** ---- ~~~ <?php $data = post('http://xxx.com', $params); file_put_contents('filename', $data); // 第一行做兩件事,發送http請求,獲取請求結果。這是同步的, // 體現在 得到結果的方式,阻塞等待,并且 在發出請求到得到結果之間的過程,即返回結果前,程序不能作別的事情。 // 第一行與第二行 是串行的關系,得到結果后保存。從上往下的代碼就是自上而下的串行執行順序,這是符合直覺的 // ------------------ asynPost('http://xxx.com', $params, function ($data) { file_put_contents('filename', $data); }); asynPost('http://xxx.com', $params2, function ($data2) { file_put_contents('filename', $data2); }); file_put_contents('filename', time()); // 第一行做兩件事,發出請求,并設置請求完成時回調函數 // 第二行同上做兩件事 // 這三行 時串行的關系,但是與第一個例子相比,它的效率高一些。 // 發出請求獲取結果的方式不同,不是主動阻塞等待獲取結果的,而是設置回調通知,即 異步 // 兩個請求可以是同時發出的,即 并行發出請求 // 總結: // 1. 同步/異步 體現在獲取調用結果的方式 上。 // 2. 串行/并行 體現在不同指令執行的 時序/同時性 上。 // 3. 阻塞/非阻塞 體現在任務執行、調度形態上。 // 4. 通常 同步阻塞/異步非阻塞 ,但這并無直接關系,也有 同步非阻塞 ,如 nginx IO多路復用是一種同步非阻塞IO模型 // https://blog.csdn.net/weixin_30564447/article/details/116945490 ~~~ ### 擴展 ~~~ 拿餐館作比喻 同步就是一個奶茶店只有兩個窗口,人多了就進不來,都得排隊買,一次只能同時服務兩個人。 異步就是,還是兩個窗口,但是額外多了一個涼亭作為休息等候的地方,不管來多少人,都可以接待,每個人點什么直接由傳菜員記錄,拿到后廚做,點好后會給你一個號,誰的奶茶好了就喊誰取,大家都不用再站著排隊了。 ~~~ [IO模型 · php筆記 · 看云](http://www.hmoore.net/xiak/php-node/786007) [就為了一個原子操作,其他CPU核心罷工了](https://mp.weixin.qq.com/s/jx0EajGXGrM3fR14P9Bm7Q) [異步IO - 廖雪峰的官方網站](https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152#0) 真正意義上的 異步IO 是說內核直接將數據拷貝至用戶態的內存單元,再通知程序直接去讀取數據。 select / poll / epoll 都是同步IO的多路復用模式 **1. 同步和異步** 同步和異步關注的是消息通信機制 所謂同步,就是在發出一個 **調用** 時,沒得到結果之前,該**調用**就不返回。但是一旦調用返回就得到返回值了,**調用者**主動等待這個**調用**的結果 所謂異步,就是在發出一個**調用**時,這個**調用**就直接返回了,不管返回有沒有結果。當一個異步過程調用發出后,*被調用者*通過狀態,通知來通知**調用者**,**或者通過回調函數處理這個調用** **2. 阻塞和非阻塞** 阻塞和非阻塞關注的是程序在等待調用結果時的狀態 阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才返回 非阻塞調用是指在不能立即得到結果之前,該調用不會阻塞當前線程 ***** last update:2018-10-21 01:58:15
                  <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>

                              哎呀哎呀视频在线观看