欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nodejs中實現(xiàn)阻塞實例

 更新時間:2015年03月24日 10:30:08   投稿:junjie  
這篇文章主要介紹了nodejs中實現(xiàn)阻塞實例,本文直接給出實例代碼,需要的朋友可以參考下

node.js中與生俱來的單線程編程、回調(diào)函數(shù)異步式風(fēng)格讓我們有時喜有時憂。先說單線程,很多人會費解于node.js的單線程如何能做到高并發(fā)?這個問題不是本文重點,點到為止。澄清一點,node.js的單線程僅僅指javascript引擎是單線程的,無論如何我們沒有辦法在javascript中實現(xiàn)多線程和阻塞(本文用到的方法同樣不是通過V8引擎實現(xiàn)同步的);但對于node.js的其他方面不代表不能多線程,例如IO。如果現(xiàn)在node.js遭受大量請求,而這些請求都是IO密集型的,那么此時node每接受一個請求,在遇到耗時較長的IO操作時,javascript線程并不會一直在此等待,而是交出控制,在回調(diào)堆棧里添加IO操作完成后要執(zhí)行的操作(當(dāng)回調(diào)層級過多,訪問數(shù)量過大,大量的回調(diào)鏈可能會爆棧)。而在這段時間內(nèi),node.js又可以處理其他請求了。所以對于node.js而言,雖然javascript是單線程的,每次只能處理一個請求,但javascript處理一個請求的時間往往較短(對于IO密集型應(yīng)用而言),只要可以異步處理,那么在處理的過程中,此次請求都會釋放控制,使node.js能處理其他請求。這并發(fā)請求的同時,IO其實一直處于并發(fā)狀態(tài),減少處理請求的線程數(shù),節(jié)約資源以增加IO的線程數(shù),對于通常耗時很長的IO密集型請求來說,無疑能帶來性能上的提升。

前面啰啰嗦嗦地一直在強調(diào)IO密集型,其實是在強調(diào)node.js的強項。相應(yīng)的,它的短板就是CPU密集型的請求。道理很簡單,javascript不會并發(fā),只能一個請求完成后才能處理其他請求。一個請求處理的時間越長,其他請求等待的時間越長。同一時間只會有一個請求被處理,并發(fā)性能很低。

話說到這兒,我想申明一點:node.js不應(yīng)該被阻塞;能異步處理的方法異步處理(如使用fs.readFile(),而非fs.syncReadFile()fs.readFileSync()方法)。

node中不能阻塞,并不代表node外不能阻塞。前面我們有講到fibers,現(xiàn)在,我們就來嘗試在fibers中實現(xiàn)阻塞。就以處理一個http請求為例吧:

復(fù)制代碼 代碼如下:

var Fiber = require('fibers');
var http = require("http");
Fiber(function () {
    var httpFiber = Fiber.current;
    var html = "";
    http.get("http://www.baidu.com", function (res) {
        var dataFiber = Fiber.current;
        res.on("data", function (data) {
            html += data;
        });
        res.on("end", function (data) {
            httpFiber.run();
        });
    });
    Fiber.yield();
    console.log(html);
}).run();

yield()、 run()這兩個方法還不了解的同學(xué),請自行查閱《fibers in node》。


fibers的運行并不在node進程中,所以在fibers內(nèi)部實現(xiàn)阻塞對node整體的性能并沒有影響。而且實現(xiàn)起來也是相當(dāng)容易,只需要在想阻塞的時候,把fiber yield掉。需要繼續(xù)運行,則執(zhí)行 run()恢復(fù)fiber。在上面的例子中,我們希望當(dāng)http.get請求發(fā)起時阻塞當(dāng)前程序,當(dāng)所有數(shù)據(jù)接收完成時,恢復(fù)程序。于是我們在調(diào)用http.get后使用 Fiber.yield()中斷此fiber。在對response的監(jiān)聽中,如果觸發(fā) end事件表明數(shù)據(jù)傳輸完成,于是在 end的回調(diào)函數(shù)中,調(diào)用 Fiber.current.run()恢復(fù)fiber,這樣,后續(xù)的代碼就以同步的方式拿到http.get請求的數(shù)據(jù)。

上面的示例只是提供一種思路。如果對這種思路進行一些抽象封裝,比如說,對有接受回調(diào)函數(shù)為參數(shù)的異步方法進行一步柯里化,在調(diào)用后中斷,并劫持回調(diào)函數(shù),以恢復(fù)程序的代碼為回調(diào)函數(shù)。獲取異步數(shù)據(jù)后,再程序觸發(fā)預(yù)定的回調(diào)函數(shù),這樣基本能實現(xiàn)異步方法同步化。這段說得比較亂,基本上就是 fibers/future的實現(xiàn)思路,如果有興趣,請參考其源代碼。

相關(guān)文章

  • Node.js利用debug模塊打印出調(diào)試日志的方法

    Node.js利用debug模塊打印出調(diào)試日志的方法

    debug日志打印模塊主要實現(xiàn)功能是帶命名空間(模塊名)、時間戳、色彩輸出日志;將日志寫入文件;瀏覽器端使用;格式化函數(shù);支持自定義方法。下面這篇文章主要介紹了Node.js利用debug模塊打印出調(diào)試日志的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • 學(xué)習(xí)使用grunt來打包JavaScript和CSS程序的教程

    學(xué)習(xí)使用grunt來打包JavaScript和CSS程序的教程

    這篇文章主要介紹了學(xué)習(xí)使用grunt來打包JavaScript和CSS程序的教程,grunt基于node.js和需要的朋友可以參考下
    2016-01-01
  • NodeJs爬蟲框架Spider基礎(chǔ)使用教程

    NodeJs爬蟲框架Spider基礎(chǔ)使用教程

    這篇文章主要為大家介紹了NodeJs爬蟲框架Spider基礎(chǔ)使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 在Linux系統(tǒng)中搭建Node.js開發(fā)環(huán)境的簡單步驟講解

    在Linux系統(tǒng)中搭建Node.js開發(fā)環(huán)境的簡單步驟講解

    這篇文章主要介紹了在Linux系統(tǒng)中搭建Node.js開發(fā)環(huán)境的步驟,Node使得JavaScript程序可以在本地操作系統(tǒng)環(huán)境中解釋運行,需要的朋友可以參考下
    2016-01-01
  • 淺談Node.js輕量級Web框架Express4.x使用指南

    淺談Node.js輕量級Web框架Express4.x使用指南

    本篇文章主要介紹了淺談Node.js輕量級Web框架Express4.x使用指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 詳解KOA2如何手寫中間件(裝飾器模式)

    詳解KOA2如何手寫中間件(裝飾器模式)

    這篇文章主要介紹了詳解KOA2如何手寫中間件(裝飾器模式),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 如何使用nvm實現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)

    如何使用nvm實現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)

    這篇文章主要給大家介紹了關(guān)于如何使用nvm實現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)的相關(guān)資料,nvm是一個node版本管理工具,通過它可以安裝多種node版本并且可以快速、簡單的切換node版本,需要的朋友可以參考下
    2023-10-10
  • 如何用Node寫頁面爬蟲的工具集

    如何用Node寫頁面爬蟲的工具集

    這篇文章主要介紹了如何用Node寫頁面爬蟲的工具集,主要介紹了三種方法,分別是Puppeteer、cheerio和Auto.js,感興趣的小伙伴們可以參考一下
    2018-10-10
  • node.js適合游戲后臺開發(fā)嗎?

    node.js適合游戲后臺開發(fā)嗎?

    這篇文章主要介紹了node.js適合游戲后臺開發(fā)嗎?node.js是不是能代替C++開發(fā)游戲后臺呢?看完本文我想你會有一定的了解了,需要的朋友可以參考下
    2014-09-09
  • 利用n工具輕松管理Node.js的版本

    利用n工具輕松管理Node.js的版本

    我們在測試寫的Nodejs的程序在不同Nodejs版本下是否能正常運行,或是我們想要嘗試下最新版 Nodejs 的新特性,但常用的代碼需要舊版本的 Nodejs的時候就需要用 Node 版本管理工具,本文介紹的是利用n工具如何輕松管理Node.js的版本,需要的朋友可以參考下。
    2017-04-04

最新評論