Node----異步編程

    node.js最大的特色就是異步式I/O與事件結合的編程模式。與傳統同步式I/O線性編程思路不一樣,由於控制流很大程度上都靠事件和回調函數來組織,一個邏輯要拆分爲若干個單元。html

        同步調用:一種阻塞式調用,一段代碼調用另外一段代碼,必須等待這段代碼執行返回結果後,才能執行下去。node

        異步調用:非阻塞式調用,一段異步代碼還未執行完,能夠繼續執行下一段代碼,當代碼執行完成後,經過回調繼續執行相應的邏輯,不耽誤其餘代碼的執行。編程

    回調並非異步調用,回調是一種解決異步函數執行結果的處理方法,在異步調用時,將執行的結果返回並處理時,能夠經過回調的方法。api

        阻塞:線程在執行中若是遇到磁盤讀寫或網絡通訊,一般會耗費較長的時間,這時操做系統會剝奪線程的cpu使用權,將其暫停執行,同時間資源讓給其餘的工做線程。當I/O操做完畢時,操做系統解除線程的阻塞狀態,恢復其使用權,將繼續執行。     簡單的說就是線程在某一時刻進行讀寫操做須要耗費必定時間,此時線程暫停等待讀取完成,完成則繼續執行下面線程。緩存

        非阻塞:當線程遇到I/O操做時,不會以阻塞的形式等待I/O操做,而是將I/O請求發送給操做系統,繼續執行下一條語句。當操做系統完成I/O操做時候,以時間的形式通知執行的I/O的線程,線程會在特定的時候處理這個事件。爲了處理異步I/O,線程必須有時間循環,不斷地檢測有沒有未處理的事件,給予處理。網絡

        node的單線程事件驅動的異步式I/O比傳統的多線程阻塞式I/O究竟好在哪呢??????簡言之,異步式I/O就是少了多線程的開銷,對於操做系統來講,建立一個線程的代價是十分昂貴的,須要給它分配內存,列入調度,同時在線程切換時還要執行內存換頁,cpu的緩存被清空,切換回來的時候還要從新從內存中讀取信息。多線程

            多線程同步式I/O   和    node單線程異步式I/O的特色異步

同步式I/O    阻塞式 異步式I/O  非阻塞式
利用多線程提升吞吐量,一個線程阻塞時還要其餘線程在工做,多線程可讓CPU資源在阻塞中不被線程浪費 單線程便可以實現高吞吐量,線程不會被阻塞,永遠在利用cpu
經過事件片分割和線程調度利用多核CPU 經過功能劃分利用多核cpu
須要有操做系統調度多線程使用多核cpu 能夠將單進程綁定到單核cpu
內存軌跡大,數據局部性弱 內存軌跡小,數據局部性強

        多線程帶來的好處僅僅是在多核Cpu的狀況下利用更多的核,而nodejs的單線程也能帶來一樣的好處。而在V0.6.0版本,Nodejs內置了cluster的特性,讓node能夠利用多核CPU實現並行。自此,Nodejs終於能夠做爲一個獨立的應用開發解決方案,映入你們眼簾了。函數

        cluster的官方地址:https://nodejs.org/api/cluster.html#cluster_cluster學習

        學習文檔:http://blog.fens.me/nodejs-core-cluster/

相關文章
相關標籤/搜索