Node.js工作线程中的I / O性能

时间:2018-10-04 13:39:41

标签: javascript node.js multithreading worker worker-thread

下面是一个工作线程示例,该线程在本地计算机上花费约600毫秒用于同步I / O:

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大约需要2s:

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);

显然,同步阻塞操作在这里更有效。

Node.js worker thread reference指出:

  

工作者对于执行CPU密集型JavaScript操作非常有用;不要将它们用于I / O,因为Node.js的异步执行操作的内置机制已经比Worker线程可以更有效地对其进行处理。

此声明的依据是什么?

关于I / O,主线程和工作线程之间有什么区别?

工作人员的目的不仅限于非阻塞异步操作吗?

在什么情况下I / O性能在工作线程中可能效率较低?

0 个答案:

没有答案