下面是一个工作线程的示例,在本地机器上同步I/O需要约600ms的时间:
const fs = require('fs');
const { isMainThread, Worker, parentPort, workerData } = require('worker_threads');
const filename = './foo.txt';
if (isMainThread) {
(async () => {
console.time('!');
await new Promise((resolve, reject) => {
const worker = new Worker(__filename, { workerData: filename });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0)
reject(new Error(`Worker stopped with exit code ${code}`));
});
});
console.timeEnd('!');
})().catch(console.error);
} else {
for (let i = 0; i < 100; i++)
fs.readFileSync(workerData);
parentPort.postMessage('ok');
}
对于异步I/O,单线程的相同示例需要2秒:
const fs = require('fs');
const filename = './foo.txt';
console.time('worker');
(function read(i) {
if (i < 100) {
fs.readFile(filename, () => read(++i));
return;
}
console.timeEnd('worker');
})(0);
显然,同步阻塞操作在这里更有效。
节点。js
worker thread reference
各国:
Worker对于执行CPU密集型JavaScript操作非常有用;不要将它们用于I/O,因为它们是节点。jss内置的异步执行操作的机制已经比工作线程更有效地处理它。
这种说法的理由是什么?
主线程和工作线程在I/O方面有什么区别?
工人的目的不是不局限于非阻塞异步操作吗?
在什么情况下,工作线程中的I/O性能可能会降低效率?