Node.js 多线程完全指南总结

2020-06-17 06:09:52易采站长站整理
message
事件中的数据后进行一些计算的 worker:


import { isMainThread, parentPort } from 'worker_threads';

if (isMainThread) {
throw new Error('Its not a worker');
}

const doCalcs = (data: any) => {
const collection = [];

for (let i = 0; i < 1000000; i += 1) {
collection[i] = Math.round(Math.random() * 100000);
}

return collection.sort((a, b) => {
if (a > b) {
return 1;
}

return -1;
});
};

parentPort.on('message', (data: any) => {
const result = doCalcs(data);

parentPort.postMessage(result);
});

worker 创建了一个包含 100 万个随机数的数组,然后对它们进行排序。只要能够多花费一些时间才能完成,做些什么事情并不重要。

以下是工作池简单用法的示例:


const pool = new WorkerPool<{ i: number }, number>(path.join(__dirname, './test-worker.js'), 8);

const items = [...new Array(100)].fill(null);

Promise.all(
items.map(async (_, i) => {
await pool.run(() => ({ i }));

console.log('finished', i);
}),
).then(() => {
console.log('finished all');
});

首先创建一个由八个 worker 组成的工作池。然后创建一个包含 100 个元素的数组,对于每个元素,我们在工作池中运行一个任务。开始运行后将立即执行八个任务,其余任务被放入队列并逐个执行。通过使用工作池,我们不必每次都创建一个 worker,从而大大提高了效率。

结论

worker_threads 
提供了一种为程序添加多线程支持的简单的方法。通过将繁重的 CPU 计算委托给其他线程,可以显着提高服务器的吞吐量。通过官方线程支持,我们可以期待更多来自AI、机器学习和大数据等领域的开发人员和工程师使用 Node.js.