a92126 2bdcee2363 对parser做了修改,变成了纯状态处理函数,调用incr就可以完成解析了。
后续进行了流处理的试验,最终结论是,不如直接全文读取。另外对比发现,同步函数xxxSync还是比对应的异步promise版本强悍一点点,所以目前整个loadcheat都是同步的,不再需要async也没问题
2024-10-11 11:18:00 +08:00

63 lines
2.0 KiB
JavaScript

const {Worker, isMainThread, parentPort, workerData} = require("worker_threads");
const readCht = require("./cht");
const { accessSync, readFileSync } = require("fs");
const ncpu = require("os").availableParallelism();
const loadcheat = (order, serial, title, file) => {
try{
accessSync( file );
}
catch( e ) {
return {serial}
}
try {
const chtfile = readFileSync(file, {encoding: "utf-8"});
const cheat = readCht(chtfile, { serial }, order);
return { serial, cheat }
}
catch (e) {
console.log("bad cheat: %s[order=%d]\n%s", title, order, e.stack)
return { serial }
}
}
if( isMainThread ) {
module.exports = ncpu > 3 ? function(list) {
const nPerThread = Math.ceil(list.length / ncpu);
const results = new Array(ncpu);
let n = 0;
return new Promise( ok => {
const workers = new Array(ncpu).fill(0).map( (_,i) => {
const sublist = list.slice(i * nPerThread, (i+1) * nPerThread);
const worker = new Worker(__filename, { workerData: sublist });
worker.once("message", msg => {
results[i] = msg;
worker.unref();
if( ++n == ncpu ) ok(results.flat());
});
} );
});
} : list => Promise.resolve( list.map( game => {
const [order, serial, title] = game;
const file = `./gba/${order}.u8`;
return loadcheat(order, serial, title ?? order, file);
} ) );
}
else {
const list = workerData;
/*Promise.all( list.map( game => {
const [order, serial, title] = game;
const file = `./gba/${order}.u8`;
return loadcheat(order, serial, title ?? order, file);
} ) ).then( res => parentPort.postMessage(res) );*/
parentPort.postMessage(
list.map( game => {
const [order, serial, title] = game;
const file = `./gba/${order}.u8`;
return loadcheat(order, serial, title ?? order, file);
})
);
}