nodejs是單程序單執行緒,但是基於V8的強大驅動力,以及事件驅動模型,nodejs的效能非常高,而且想達到多核或者多程序也不是很難(現在已經有大量的第三方module來實現這個功能)。 這裡主要不是介紹nodejs具體應用程式碼,而是想介紹一下事件驅動程式設計。 DanYork介紹了兩種典型的事件驅動例項。 第一個例子是關於醫生看病。 在美國去看醫生,需要填寫大量表格,比如保險、個人資訊之類,傳統的基於執行緒的系統(thread-basedsystem),接待員叫到你,你需要在前臺填寫完成這些表格,你站著填單,而接待員坐著看你填單。你讓接待員沒辦法接待下一個客戶,除非完成你的業務。 想讓這個系統能執行的快一些,只有多加幾個接待員,人力成本需要增加不少。 基於事件的系統(event-basedsystem)中,當你到視窗發現需要填寫一些額外的表格而不僅僅是掛個號,接待員把表格和筆給你,告訴你可以找個座位填寫,填完了以後再回去找他。你回去坐著填表,而接待員開始接待下一個客戶。你沒有阻塞接待員的服務。 第二個例子是快餐店點餐。 在基於執行緒的方式中(thread-basedway)你到了櫃檯前,把你的點餐單給收銀員或者給收銀員直接點餐,然後等在那直到你要的食物準備好給你。收銀員不能接待下一個人,除非你拿到食物離開。想接待更多的客戶,容易!加更多的收銀員! 當然,我們知道快餐店其實不是這樣工作的。他們其實就是基於事件驅動方式,這樣收銀員更高效。只要你把點餐單給收銀員,某個人已經開始準備你的食物,而同時收銀員在進行收款,當你付完錢,你就站在一邊而收銀員已經開始接待下一個客戶。在一些餐館,甚至會給你一個號碼,如果你的食物準備好了,就呼叫你的號碼讓你去櫃檯取。關鍵的一點是,你沒有阻塞下一個客戶的訂餐請求。你訂餐的食物做好的事件會導致某個人做某個動作(某個服務員喊你的訂單號碼,你聽到你的號碼被喊到去取食物),在程式設計領域,我們稱這個為回撥(callbackfunction)。 相反的,Node.Js使用事件驅動模型,當webserver接收到請求,就把它關閉然後進行處理,然後去服務下一個web請求。當這個請求完成,它被放回處理佇列,當到達佇列開頭,這個結果被返回給使用者。這個模型非常高效可擴充套件性非常強,因為webserver一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅動IO)。 考慮下面這個過程: 你用瀏覽器訪問nodejs伺服器上的"/about.html" nodejs伺服器接收到你的請求,呼叫一個函式從磁碟上讀取這個檔案。 這段時間,nodejswebserver在服務後續的web請求。 當檔案讀取完畢,有一個回撥函式被插入到nodejs的服務佇列中。 nodejswebserver執行這個函式,實際上就是渲染(render)了about.html頁面返回給你的瀏覽器。 好像就節省了幾微秒時間,但是這很重要!特別是對於需要相應大量使用者的webserver。
nodejs是單程序單執行緒,但是基於V8的強大驅動力,以及事件驅動模型,nodejs的效能非常高,而且想達到多核或者多程序也不是很難(現在已經有大量的第三方module來實現這個功能)。 這裡主要不是介紹nodejs具體應用程式碼,而是想介紹一下事件驅動程式設計。 DanYork介紹了兩種典型的事件驅動例項。 第一個例子是關於醫生看病。 在美國去看醫生,需要填寫大量表格,比如保險、個人資訊之類,傳統的基於執行緒的系統(thread-basedsystem),接待員叫到你,你需要在前臺填寫完成這些表格,你站著填單,而接待員坐著看你填單。你讓接待員沒辦法接待下一個客戶,除非完成你的業務。 想讓這個系統能執行的快一些,只有多加幾個接待員,人力成本需要增加不少。 基於事件的系統(event-basedsystem)中,當你到視窗發現需要填寫一些額外的表格而不僅僅是掛個號,接待員把表格和筆給你,告訴你可以找個座位填寫,填完了以後再回去找他。你回去坐著填表,而接待員開始接待下一個客戶。你沒有阻塞接待員的服務。 第二個例子是快餐店點餐。 在基於執行緒的方式中(thread-basedway)你到了櫃檯前,把你的點餐單給收銀員或者給收銀員直接點餐,然後等在那直到你要的食物準備好給你。收銀員不能接待下一個人,除非你拿到食物離開。想接待更多的客戶,容易!加更多的收銀員! 當然,我們知道快餐店其實不是這樣工作的。他們其實就是基於事件驅動方式,這樣收銀員更高效。只要你把點餐單給收銀員,某個人已經開始準備你的食物,而同時收銀員在進行收款,當你付完錢,你就站在一邊而收銀員已經開始接待下一個客戶。在一些餐館,甚至會給你一個號碼,如果你的食物準備好了,就呼叫你的號碼讓你去櫃檯取。關鍵的一點是,你沒有阻塞下一個客戶的訂餐請求。你訂餐的食物做好的事件會導致某個人做某個動作(某個服務員喊你的訂單號碼,你聽到你的號碼被喊到去取食物),在程式設計領域,我們稱這個為回撥(callbackfunction)。 相反的,Node.Js使用事件驅動模型,當webserver接收到請求,就把它關閉然後進行處理,然後去服務下一個web請求。當這個請求完成,它被放回處理佇列,當到達佇列開頭,這個結果被返回給使用者。這個模型非常高效可擴充套件性非常強,因為webserver一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅動IO)。 考慮下面這個過程: 你用瀏覽器訪問nodejs伺服器上的"/about.html" nodejs伺服器接收到你的請求,呼叫一個函式從磁碟上讀取這個檔案。 這段時間,nodejswebserver在服務後續的web請求。 當檔案讀取完畢,有一個回撥函式被插入到nodejs的服務佇列中。 nodejswebserver執行這個函式,實際上就是渲染(render)了about.html頁面返回給你的瀏覽器。 好像就節省了幾微秒時間,但是這很重要!特別是對於需要相應大量使用者的webserver。