node.js async流程控制器--queue(队列)
queue流程控制器是一個(gè)并行的流程控制器,但是它與parallel的區(qū)別在于queue可以控制一次執(zhí)行幾個(gè)函數(shù),而parallel只是讓所有函數(shù)并行執(zhí)行.
例子如下:
var q = async.queue(function (obj,cb) {setTimeout(function () {console.log(obj);cb(); },obj.time) },1)for (var i = 0; i<100; i++) {console.log(1);
q.push({name:i,time:i*1000},function (err) { console.log(err);
}) };for (var i = 0; i<100; i++) {console.log(2);q.push({name:1,time:1000},function (err) {
console.log(err);
}) };
?
這里用了一個(gè)偽異步執(zhí)行的方式,queue的參數(shù)有兩個(gè),第一個(gè)是一個(gè)函數(shù),第二個(gè)是執(zhí)行的進(jìn)程數(shù),第一個(gè)參數(shù)又包含兩個(gè)參數(shù),第一個(gè)是傳遞的對(duì)象,第二個(gè)是回調(diào)函數(shù),例子中只有在console.log(obj)執(zhí)行完后調(diào)用cb();隊(duì)列才會(huì)往下執(zhí)行,queue會(huì)返回一個(gè)標(biāo)識(shí)符(例子中的q).
例子中的q.push是往隊(duì)列中添加數(shù)據(jù)(會(huì)被queue里的obj接收),第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),如果有異常會(huì)觸發(fā)此回調(diào)函數(shù)。例子中每次只插入一個(gè)數(shù)據(jù),也可以插入多個(gè)例如q.push([{name:0,time:1000}],{name:1,time:2000}]);(這里是個(gè)數(shù)組).
這里為了確認(rèn)循環(huán)是否真的執(zhí)行,所以在循環(huán)中打印了兩個(gè)數(shù)字.執(zhí)行的結(jié)果是先循環(huán)打印了console.log(1)然后再循環(huán)打印了console.log(2),這里說(shuō)明 ?確實(shí)兩個(gè)循環(huán)執(zhí)行到了,然后會(huì)先把第一個(gè)循環(huán)加入到queue里的對(duì)象打出來(lái),然后把第二個(gè)循環(huán)打印出來(lái),充分遵守了隊(duì)列的性質(zhì):先進(jìn)先出,后進(jìn)后出的規(guī)則,不會(huì)因?yàn)橐驗(yàn)閳?zhí)行的時(shí)間而使得結(jié)果混亂.如果把queue里的工作數(shù)改為2,則會(huì)每次打印兩個(gè).
?
queue還有幾個(gè)函數(shù),比如:
worker數(shù)量將用完時(shí),會(huì)調(diào)用saturated函數(shù):
q.saturated = function() { log(‘a(chǎn)ll workers to be used’); }?
當(dāng)最后一個(gè)任務(wù)交給worker執(zhí)行時(shí),會(huì)調(diào)用empty函數(shù)
q.empty = function() { log(‘no more tasks wating’); }?
當(dāng)所有任務(wù)都執(zhí)行完時(shí),會(huì)調(diào)用drain函數(shù)
q.drain = function() { console.log(‘a(chǎn)ll tasks have been processed’); }?
轉(zhuǎn)載于:https://www.cnblogs.com/tudou1223/p/4151851.html
總結(jié)
以上是生活随笔為你收集整理的node.js async流程控制器--queue(队列)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java(Android)线程池
- 下一篇: android 中如何模拟back键