最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node 使用 async 控制并發(fā)的方法

 更新時(shí)間:2018年05月07日 15:00:49   作者:alsotang  
這篇文章主要介紹了node 使用 async 控制并發(fā)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

目標(biāo)

建立一個(gè) lesson5 項(xiàng)目,在其中編寫代碼。

代碼的入口是 app.js,當(dāng)調(diào)用 node app.js 時(shí),它會輸出 CNode(https://cnodejs.org/ ) 社區(qū)首頁的所有主題的標(biāo)題,鏈接和第一條評論,以 json 的格式。

注意:與上節(jié)課不同,并發(fā)連接數(shù)需要控制在 5 個(gè)。

輸出示例:

[
 {
  "title": "【公告】發(fā)招聘帖的同學(xué)留意一下這里",
  "href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12",
  "comment1": "呵呵呵呵"
 },
 {
  "title": "發(fā)布一款 Sublime Text 下的 JavaScript 語法高亮插件",
  "href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f",
  "comment1": "沙發(fā)!"
 }
]

知識點(diǎn)

學(xué)習(xí) async(https://github.com/caolan/async ) 的使用。這里有個(gè)詳細(xì)的 async demo 演示:https://github.com/alsotang/async_demo

學(xué)習(xí)使用 async 來控制并發(fā)連接數(shù)。

課程內(nèi)容

lesson4 的代碼其實(shí)是不完美的。為什么這么說,是因?yàn)樵?lesson4 中,我們一次性發(fā)了 40 個(gè)并發(fā)請求出去,要知道,除去 CNode 的話,別的網(wǎng)站有可能會因?yàn)槟惆l(fā)出的并發(fā)連接數(shù)太多而當(dāng)你是在惡意請求,把你的 IP 封掉。

我們在寫爬蟲的時(shí)候,如果有 1000 個(gè)鏈接要去爬,那么不可能同時(shí)發(fā)出 1000 個(gè)并發(fā)鏈接出去對不對?我們需要控制一下并發(fā)的數(shù)量,比如并發(fā) 10 個(gè)就好,然后慢慢抓完這 1000 個(gè)鏈接。

用 async 來做這件事很簡單。

這次我們要介紹的是 async 的 mapLimit(arr, limit, iterator, callback) 接口。另外,還有個(gè)常用的控制并發(fā)連接數(shù)的接口是 queue(worker, concurrency),大家可以去 https://github.com/caolan/async#queueworker-concurrency 看看說明。

這回我就不帶大家爬網(wǎng)站了,我們來專注知識點(diǎn):并發(fā)連接數(shù)控制。

對了,還有個(gè)問題是,什么時(shí)候用 eventproxy,什么時(shí)候使用 async 呢?它們不都是用來做異步流程控制的嗎?

我的答案是:

當(dāng)你需要去多個(gè)源(一般是小于 10 個(gè))匯總數(shù)據(jù)的時(shí)候,用 eventproxy 方便;當(dāng)你需要用到隊(duì)列,需要控制并發(fā)數(shù),或者你喜歡函數(shù)式編程思維時(shí),使用 async。大部分場景是前者,所以我個(gè)人大部分時(shí)間是用 eventproxy 的。

正題開始。

首先,我們偽造一個(gè) fetchUrl(url, callback) 函數(shù),這個(gè)函數(shù)的作用就是,當(dāng)你通過

fetchUrl('http://www.baidu.com', function (err, content) {
 // do something with `content`
});

調(diào)用它時(shí),它會返回 http://www.baidu.com 的頁面內(nèi)容回來。

當(dāng)然,我們這里的返回內(nèi)容是假的,返回延時(shí)是隨機(jī)的。并且在它被調(diào)用時(shí),會告訴你它現(xiàn)在一共被多少個(gè)地方并發(fā)調(diào)用著。

// 并發(fā)連接數(shù)的計(jì)數(shù)器
var concurrencyCount = 0;
var fetchUrl = function (url, callback) {
 // delay 的值在 2000 以內(nèi),是個(gè)隨機(jī)的整數(shù)
 var delay = parseInt((Math.random() * 10000000) % 2000, 10);
 concurrencyCount++;
 console.log('現(xiàn)在的并發(fā)數(shù)是', concurrencyCount, ',正在抓取的是', url, ',耗時(shí)' + delay + '毫秒');
 setTimeout(function () {
  concurrencyCount--;
  callback(null, url + ' html content');
 }, delay);
};

我們接著來偽造一組鏈接

var urls = [];
for(var i = 0; i < 30; i++) {
 urls.push('http://datasource_' + i);
}

這組鏈接的長這樣:

接著,我們使用 async.mapLimit 來并發(fā)抓取,并獲取結(jié)果。

async.mapLimit(urls, 5, function (url, callback) {
 fetchUrl(url, callback);
}, function (err, result) {
 console.log('final:');
 console.log(result);
});

運(yùn)行輸出是這樣的:

可以看到,一開始,并發(fā)鏈接數(shù)是從 1 開始增長的,增長到 5 時(shí),就不再增加。當(dāng)其中有任務(wù)完成時(shí),再繼續(xù)抓取。并發(fā)連接數(shù)始終控制在 5 個(gè)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • node.js接口復(fù)習(xí)及使用案例解析

    node.js接口復(fù)習(xí)及使用案例解析

    這篇文章主要為大家介紹了node.js接口的復(fù)習(xí)及使用案例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建

    Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建

    這篇文章主要為大家介紹了Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 基于模板引擎Jade的應(yīng)用(詳解)

    基于模板引擎Jade的應(yīng)用(詳解)

    下面小編就為大家分享一篇基于模板引擎Jade的應(yīng)用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Node.js中流(stream)的使用方法示例

    Node.js中流(stream)的使用方法示例

    Stream 是一個(gè)抽象接口,Node 中有很多對象實(shí)現(xiàn)了這個(gè)接口。下面這篇文章主要給大家介紹了關(guān)于Node.js中流(stream)的使用方法示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • NodeJS實(shí)現(xiàn)視頻轉(zhuǎn)碼的示例代碼

    NodeJS實(shí)現(xiàn)視頻轉(zhuǎn)碼的示例代碼

    本篇文章主要介紹了NodeJS實(shí)現(xiàn)視頻轉(zhuǎn)碼的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Node.js的npm包管理器基礎(chǔ)使用教程

    Node.js的npm包管理器基礎(chǔ)使用教程

    特別是JavaScript領(lǐng)域中,基于NPM的網(wǎng)絡(luò)傳輸方式真的是越來越流行,包括React與Vue等許多JavaScript庫與框架都選擇使用npm進(jìn)行管理,這里就為大家送上Node.js的npm包管理器基礎(chǔ)使用教程,需要的朋友可以參考下
    2016-05-05
  • nodeJS?express路由學(xué)習(xí)req.body與req.query方法實(shí)例詳解

    nodeJS?express路由學(xué)習(xí)req.body與req.query方法實(shí)例詳解

    這篇文章主要為大家介紹了nodeJS?express路由學(xué)習(xí)req.body與req.query方法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Nestjs自定義注解實(shí)現(xiàn)接口權(quán)限控制詳解

    Nestjs自定義注解實(shí)現(xiàn)接口權(quán)限控制詳解

    這篇文章主要為大家介紹了Nestjs自定義注解實(shí)現(xiàn)接口權(quán)限控制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳解node.js中的npm和webpack配置方法

    詳解node.js中的npm和webpack配置方法

    Node.js用c++語言編寫而成的,是一個(gè)基于chrome V8引擎的javascript運(yùn)行環(huán)境。這篇文章主要介紹了詳解node.js中的npm和webpack配置,需要的朋友可以參考下
    2018-01-01
  • nodejs中使用archive壓縮文件的實(shí)現(xiàn)代碼

    nodejs中使用archive壓縮文件的實(shí)現(xiàn)代碼

    這篇文章主要介紹了nodejs中使用archive壓縮文件的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評論

张家港市| 华坪县| 祁东县| 乌拉特前旗| 贡山| 彰武县| 新野县| 南华县| 桐城市| 休宁县| 诏安县| 温泉县| 繁峙县| 达孜县| 永济市| 文山县| 邢台县| 葫芦岛市| 吉首市| 密云县| 盐津县| 兴义市| 来凤县| 紫金县| 醴陵市| 勐海县| 昭通市| 安国市| 德钦县| 沾化县| 黎川县| 淮北市| 奉贤区| 子洲县| 寿阳县| 潞西市| 新化县| 怀柔区| 苍山县| 白城市| 晋州市|