Javascript模擬多線程


副標題:Javascript異步通信的實現原理與multi-node
(學習心得,不敢獨享,歡迎指正)

兩個問題:
1、Node編程中所有通信都是異步執行的,如果某個事件的響應函數需要操作全局變量,則多個回調同時運行時怎么實現同步?
2、群里里面的兄弟“老狗”發現了一個項目:multi-node,即使用可以用其編寫多線程的網絡服務。 但是node本來就是異步的,為什么還需要多線程?

解答:
首先說一下JS的執行原理:js引擎執行js代碼的時候是單線程的,即同一時刻只會有一個進程執行JS代碼,回調函數也是一個一個執行的(按照事件發生的順序,而不是代碼的順序)。JS中的異步通信和定時是由另外的線程實現的,脫離js線程上下文。以JS定時操作舉例,當JS引擎執行setTimeout(callbackFunction, 100)操作時,它會通知定時線程我需要100毫秒的定時,之后JS引擎進入事件循環。100毫秒之后,定時引擎向事件隊列中加入一個時間已到的事件。JS引擎從隊列中讀取時間已到的事件,執行callbackFunction。 如果同一時間有多個事件加入事件隊列,JS引擎也只會一個一個的執行callback。對於異步也是同樣,JS代碼發起通信請求,通信線程執行通信操作,並在操作完成后將完成事件加入事件隊列。JS引擎從隊列中取出事件並調用回調處理通信結果。JS引擎在執行回調函數的時候,不能同時響應其他事件。


JS引擎示意圖

如上所述,第一個問題迎刃而解,單線程自然就不必考慮同步問題了。對於Node應用而言,它是部分多線程,即非阻塞IO為多線程,但是IO結果的處理還是單線程執行。所以在IO結果處理比較復雜占用很多時間的時候,還是有必要啟動多個node線程來響應請求的。不過話又說回來,像node這種編程模型的優點就是可以使用簡單的代碼寫出高性能的應用,如果使用多個node線程,則處理它們之間的數據交換和同步就會大大增加應用編寫的復雜程度,是否得不償失就需要認真斟酌了。

相關資料:
瀏覽器中JS執行原理的說明:http://www.phpv.net/html/1700.html
瀏覽器偽多線程庫:http://www.infoq.com/cn/articles/js_multithread


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM