async和enterproxy控制併發數量

2022-01-11 02:24:56 字數 3004 閱讀 7368

相對於併發,並行可能陌生了不少,並行指一組程式按獨立非同步的速度執行,不等於時間上的重疊(同乙個時刻發生),通過增加cpu核心來實現多個程式(任務)的同時進行。沒錯,並行做到了多工的同時進行

enterproxy是樸靈大大為主要貢獻的工具,帶來一種事件式程式設計的思維變化,利用事件機制解耦複雜業務邏輯,解決了**函式耦合性的詬病,將序列等待變成並行等待,提公升多非同步協作場景下的執行效率

我們如何使用enterproxy控制併發數量?通常如果我們不使用enterproxy和自製的計數器,我們如果抓取三個源:

這種深層巢狀,序列的方式

var render = function (template, data) ;

$.get("template", function (template) );

});});

除去這種過去深層巢狀的方法,我們常規的寫法的自己維護乙個計數器

(function();

$.get('template',function(data))

$.get('data',function(data))

$.get('l10n',function(data))

function handle()

}})();

在這裡,enterproxy就可以起到這個計數器的作用,它幫你管理這些非同步操作是否完成,完成之後,他會自動呼叫你提供的處理函式,並將抓取到資料當做引數傳遞過來

enterproxy還提供了其他不少場景所需的api,可以自行學習下這個api enterproxy

使用async中maplimit控制一次性併發數量為5,一次性只抓取5個鏈結。

async.maplimit(arr, 5, function (url, callback) , function (error, result) )
我們首先應該知道什麼是併發,為什麼需要限制併發數量,都有哪些處理方案。然後就可以去文件具體看一下api如何使用。async文件可以很好的學習這些語法。

模擬一組資料,這裡返回的資料是假的,返回的延時是隨機的。

var concurreycount = 0;

var fetchurl = function(url,callback),delay);

}var urls = ;

for(var i = 0;i<30;i++)

然後我們使用async.maplimit來併發抓取,並獲取結果。

async.maplimit(urls,5,function(url,callback),function(err,result))
模擬摘自alsotang

執行輸出後得到以下結果

我們發現,併發數從1開始增長,但是增長到5時,就不在增加。然有任務時就繼續抓取,併發連線數量始終控制在5個。

因為alsotang前輩的《node包教不包會》教程例子中使用的eventproxy控制的併發數量,我們就來完成乙個使用async控制併發數量的node簡易爬蟲。

爬取的目標就是本站首頁(手動護臉)

第一步,首先我們需要用到以下的模組:

通過npm安裝依賴模組

第二步,通過require引入依賴模組,確定爬取物件url:

var url = require("url");

var async = require("async");

var cheerio = require("cheerio");

var superagent = require("superagent");

var baseurl = '';

第三步:使用superagent請求目標url,並使用cheerio處理baseurl得到目標內容url,並儲存在陣列arr中

superagent.get(baseurl)

.end(function (err, res)

var arr = ;

var $ = cheerio.load(res.text);

// 下面和jquery操作是一樣一樣的..

$(".post-list .post-title-link").each(function (idx, element) );

output(arr);

// 第四步:接下來遍歷arr,解析每乙個頁面需要的資訊

})

我們需要乙個函式驗證抓取的url物件,很簡單我們只需要乙個函式遍歷arr並列印出來就可以:

function output(arr)

console.log('「fetch」' + url + ' successful!');

var $ = cheerio.load(mes.text);

var jsondata = ;

callback(null,jsondata);

},function(error,results))

})

好了,到這裡我們的node簡易的小爬蟲就完成了,來看看效果吧

嗨呀,首頁資料好少,但是成功了呢。

node.js 包教不包會 - alsotang

enterproxy

async

async documentation

非同步和等待 async和await

在.net 4.5中,通過async和await兩個關鍵字,引入了一種新的基於任務的非同步程式設計模型 tap 在這種方式下,可以通過類似同步方式編寫非同步 極大簡化了非同步程式設計模型。如下式乙個簡單的例項 static async void downloadstringasync2 uri ur...

defer和async的區別

當瀏覽器碰到 script 指令碼的時候 沒有 defer 或 async,瀏覽器會立即載入並執行指定的指令碼,立即 指的是在渲染該 script 標籤之下的文件元素之前,也就是說不等待後續載入的文件元素,讀到就載入並執行。有 async,載入和渲染後續文件元素的過程將和 script.js 的載入...

defer和async的區別

當瀏覽器碰到script指令碼的時候 沒有defer或async,瀏覽器會立即載入並執行指定的指令碼,立即 指的是在渲染該script標籤之下的文件元素之前,也就是說不等待後續載入的文件元素,讀到就載入並執行。有async,載入和渲染後續文件元素的過程將和script.js的載入與執行並行進行 非同...