Przeglądaj źródła

build: parallelize multi package builds

Evan You 5 lat temu
rodzic
commit
3016b811b8
1 zmienionych plików z 18 dodań i 2 usunięć
  1. 18 2
      scripts/build.js

+ 18 - 2
scripts/build.js

@@ -50,9 +50,25 @@ async function run() {
 }
 
 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) {