perf: improve rpc efficiency

pull/3386/head
Yuxuan Zhang 2 years ago
parent 2149f6bffd
commit 1b47c8e3eb
No known key found for this signature in database
GPG Key ID: 6910B04F3351EF7D

@ -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",

@ -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:

@ -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<string> = 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<string>
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 {

Loading…
Cancel
Save