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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| const fork = require('child_process').fork;
const os = require('os'); const task_num = os.cpus().length;
let data = [1,2,3,4,5,6,7,8];
function chunk(array) { let chunk = os.cpus().length; let result = []; let num = Math.ceil(array.length/chunk);
for(let i = 0; i < array.length; i += num) { result.push( array.slice(i, i + num ) ); }
return result;
}
data = chunk(data);
let task = task_num;
let retry = new Map(); let retry_time = 3; [...Array(task_num).keys()].map((num)=>{ let c = fork('./child_script',[num]); let cnum = data[num].length; c.send({ data : data[num] });
c.on('message', (m)=>{ cnum--;
if(m.err) { if(!retry.has(m.data) || (retry.has(m.data) && retry.get(m.data) < retry_time )) { cnum++; c.send({data: m.data}); retry.set(m.data, !retry.has(m.data) ? 1 : retry.get(m.data) + 1); }else{ } }else{ } console.log(m); if(!cnum){ c.kill('SIGTERM'); } });
c.on('exit', ()=>{ task--; console.log('task closed. num: ', num); if(!task){ } });
c.on('error', (e)=>{ console.log('err', e) }); });
|