diff --git a/package.json b/package.json index 1883ed93..0b9c8dc6 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "mark.js": "8.11.1", "minisearch": "^6.3.0", "mrmime": "^2.0.0", - "rpc-magic-proxy": "0.0.0-beta.0", + "rpc-magic-proxy": "0.0.0-beta.1", "shikiji": "^0.9.12", "shikiji-transformers": "^0.9.12", "vite": "^5.0.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd0f668f..11c9cbb3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,8 +45,8 @@ importers: specifier: ^2.0.0 version: 2.0.0 rpc-magic-proxy: - specifier: 0.0.0-beta.0 - version: 0.0.0-beta.0 + specifier: 0.0.0-beta.1 + version: 0.0.0-beta.1 shikiji: specifier: ^0.9.12 version: 0.9.12 @@ -3916,8 +3916,8 @@ packages: '@rollup/rollup-win32-x64-msvc': 4.9.1 fsevents: 2.3.3 - /rpc-magic-proxy@0.0.0-beta.0: - resolution: {integrity: sha512-1UFsu4fpV/OGL8c1knrnx613zzZY9XSbqLUd5pSmOfh0ErAz1R8Dve5S65otFAtNtTO56SWFHbutHcw1lUkkcg==} + /rpc-magic-proxy@0.0.0-beta.1: + resolution: {integrity: sha512-Vqf8sflbh/Xpw6pfFAV+sd4iY3yJYN/vhh0WdTMTVGg5Lva3gwumPfSA4X5RFjSulLcjxusOUrlXp9vJ8ycgKQ==} dev: false /run-parallel@1.2.0: diff --git a/src/node/build/render-worker.ts b/src/node/build/render-worker.ts index a2c412f5..04ce2773 100644 --- a/src/node/build/render-worker.ts +++ b/src/node/build/render-worker.ts @@ -14,24 +14,25 @@ export default async function cluster( ) { const concurrency = context.config.buildConcurrency || 1 const num_tasks = pages.length - let progress = -concurrency const pageAlloc: TaskAllocator = async () => { - progress++ - if (progress >= 0) update(progress, num_tasks) - return pages.shift() + const page = pages.shift() + if (page) update(num_tasks - pages.length, num_tasks) + return page } const tasks = [] + const ctx = new RpcContext() + const workerData = await ctx.serialize({ + concurrency, + entryPath, + pageAlloc, + context, + workload: 'render' + }) + for (let _ = 0; _ < concurrency; _++) { - const ctx = new RpcContext() - const workerData = await ctx.serialize({ - entryPath, - pageAlloc, - context, - workload: 'render' - }) const worker = new Worker(new URL(import.meta.url), { workerData }) ctx.bind(worker) tasks.push( @@ -51,10 +52,12 @@ async function renderWorker() { const ctx = new RpcContext(parentPort!) try { const { + concurrency, entryPath, pageAlloc, context }: { + concurrency: number entryPath: string pageAlloc: TaskAllocator context: RenderPageContext @@ -62,11 +65,14 @@ async function renderWorker() { const { pathToFileURL } = await import('url') const { renderPage } = await import('./render') const { render } = await import(pathToFileURL(entryPath).toString()) - while (true) { - const page = await pageAlloc() - if (!page) break - await renderPage(render, page, context) + async function executor() { + while (true) { + const page = await pageAlloc() + if (!page) break + await renderPage(render, page, context) + } } + await Promise.all(Array.from({ length: concurrency * 4 }, () => executor())) } catch (e) { console.error(e) } finally {