-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcargo.js
56 lines (45 loc) · 1.33 KB
/
cargo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
var async = require('async');
var fs = require('fs');
var helper = require('./helper');
var log = helper.log;
var wait = helper.wait;
/**
* cargo是一个串行执行的消息队列,限制了worker数量,不再一次性全部执行
* 当worker数量不够时,新加入的任务将会排队等候,直到worker空闲出来
*
* cargo每次会加载满额的任务单元,只有任务单元中全部执行完后,才会加载新的任务单元
*
*/
// cargo(worker,payload)
// worker是用于处理任务数组的异步函数
// payload用于确定每轮可执行的任务数,默认是无限
var cargo = async.cargo(function(tasks,callback){
for(var i = 0,l = tasks.length;i < l;i++){
log('start ' + tasks[i].name);
}
callback();
},2);
// saturated监听worker将要饱和
cargo.saturated = function(){
log('worker将要饱和');
};
// empty 任务单元中最后一个任务提交给worker后触发
cargo.empty = function(){
log('任务单元中没有任务等待');
};
// 所有任务完成后调用
cargo.drain = function(){
log('所有任务已完成');
};
cargo.push({'name': 'A'},function(err){
wait(1000);
log('finished A');
});
cargo.push({'name':'B'},function(err){
wait(200);
log('finished B');
});
cargo.push({'name':'C'},function(err){
wait(300);
log('finished C');
});