f: make parallel requests

This commit is contained in:
AJ ONeal
2023-12-28 02:05:18 -07:00
parent 36c3de2ffc
commit 65c27afe49
2 changed files with 52 additions and 5 deletions
+8 -5
View File
@@ -5,6 +5,7 @@ let Fs = require('node:fs/promises');
let Path = require('node:path');
let BuildsCacher = require('./builds-cacher.js');
let Parallel = require('./parallel.js');
var INSTALLERS_DIR = Path.join(__dirname, '..');
var CACHE_DIR = Path.join(__dirname, '../_cache');
@@ -110,15 +111,17 @@ async function main() {
// return triples;
// // process.exit(1)
let triples = [];
let rows = [];
let triples = [];
let valids = Object.keys(dirs.valid);
console.info(`Fetching builds for`);
for (let name of valids) {
let limit = 25;
//let limit = 1;
await Parallel.run(limit, valids, async function (name, i) {
if (name === 'webi') {
// TODO fix the webi faux package
// (not sure why I even created it)
continue;
return;
}
console.info(` ${name}`);
@@ -152,9 +155,9 @@ async function main() {
}
triples.push(triplet);
rows.push(`${triplet}\t${name}\t${build.version}`);
rows.push(`${triplet}\t${pkg.name}\t${build.version}`);
}
}
});
let tsv = rows.join('\n');
console.info('');
console.info('#rows', rows.length);
+44
View File
@@ -0,0 +1,44 @@
'use strict';
var Parallel = module.exports;
Parallel.run = async function (limit, arr, fn) {
let index = 0;
let actives = [];
let results = [];
limit = Math.min(limit, arr.length);
function launch() {
let _index = index;
let p = fn(arr[_index], _index, arr);
// some tasks may be synchronous
// so we must push before removing
actives.push(p);
p.then(function _resolve(result) {
let i = actives.indexOf(p);
actives.splice(i, 1);
results[_index] = result;
});
index += 1;
}
// start tasks in parallel, up to limit
for (; actives.length < limit; ) {
launch();
}
// keep the task queue full
for (; index < arr.length; ) {
// wait for one task to complete
await Promise.race(actives);
// add one task again
launch();
}
// wait for all remaining tasks
await Promise.all(actives);
return results;
};