2013-10-04 23 views
0

很明顯,我不明白關於「異步」環境(比如NodeJS)和「同步」環境的大不了。假冒異性有多容易?

假設你被困在同步環境中。不能將主迴路只是說:

while(1) { 
events << check_for_stuff_from_the_outside_world(); 
for e in events {e.process()} 
} 

有什麼不好做,怎麼就是沒有一個異步環境下,如何是異步的環境有什麼不同?

+0

'check_for_stuff_from_the_outside_world()'是在處理一個相當大的問題,如何處理a)任意數量的事件源; b)不止一種事件源; c)當一個事件源無需報告時,不會阻塞。 – millimoose

+0

不會消耗不必要的CPU週期,或者更糟的是鎖定線程? – James

+0

儘管你可以想象一個統一的設計來處理來自任何類型的非阻塞源的事件,這將使e.process()真的很笨重 - 對於初學者來說,你必須檢查事件的源代碼和鍵入併發送給適當的處理程序,並且基本上最終會得到與SAX一樣糟糕的設計。現在Node.JS有點笨重(它真的需要一個'async ..等待),但它仍然會導致更爲自然的代碼,使您能夠在異步輸入和它們的處理程序之間清晰地表達數據流。 – millimoose

回答

2

是的,這或多或少是Node.js所做的,除了代替check_for_stuff_from_the_outside_world(),它應該是check_for_stuff_from_the_outside_world_plus_follow_on_stuff_from_previous_events();而且所有事件也必須以這樣的方式編寫,而不是完成處理,他們只需完成大量工作,然後致電register_stuff_for_follow_up(follow_on_event)。換句話說,您實際上必須編寫所有您的代碼才能與此事件框架進行交互;它不能「透明地」完成,只有主循環不必擔心。

這是Node.js爲什麼是JavaScript的重要組成部分;大多數語言都有預先存在的標準庫(用於I/O等),這些庫不是建立在異步框架之上的。 JavaScript在希望每個託管環境提供適合其自身用途的庫方面相對不常見(例如,瀏覽器JS的「標準庫」可能與命令行JS環境的「標準庫」幾乎沒有任何共同之處作爲SpiderMonkey),它使Node.js能夠靈活地設計與其事件循環一起工作的庫。

0

看看示例中的維基百科頁面上: https://en.wikipedia.org/wiki/Nodejs#Examples

通知代碼是如何真正專注於服務器的功能 - 它應該做的。 Node.js基本上是這麼說的:「給我一個函數,當你從網絡中得到東西時你想要做的事情,當東西從網絡到達時我們會調用它」,所以你不必編寫所有代碼處理網絡連接等問題。

如果您曾經手動編寫過網絡代碼,那麼您知道最終會一遍又一遍地寫同樣的東西,但它也是非常重要的代碼(無論是大小還是大小)複雜性),如果你試圖使它具有專業質量,強大,高性能和可擴展......(這是每個人都一直在提及的check_for_stuff_from_the_outside_world()的隱藏複雜性)。因此,Node.js負責完成所有這些爲你(包括HTTP協議,如果你使用HTTP),你只需要編寫你的服務器邏輯。

所以,並不是說異步更好,本身。它只是希望成爲適合他們提供的功能的自然模型。你會看到異步模型也出現在很多其他地方:基於事件的編程(用於很多GUI的東西),RPC服務器(例如Thrift),REST服務器,命名一些...當然,異步I/O。 ;)