}
async function buildAll(targets) {
- for (const target of targets) {
- await build(target)
+ await runParallel(require('os').cpus().length, targets, build)
+}
+
+async function runParallel(maxConcurrency, source, iteratorFn) {
+ const ret = []
+ const executing = []
+ for (const item of source) {
+ const p = Promise.resolve().then(() => iteratorFn(item, source))
+ ret.push(p)
+
+ if (maxConcurrency <= source.length) {
+ const e = p.then(() => executing.splice(executing.indexOf(e), 1))
+ executing.push(e)
+ if (executing.length >= maxConcurrency) {
+ await Promise.race(executing)
+ }
+ }
}
+ return Promise.all(ret)
}
async function build(target) {