NodeJS 并发编程方式:让我们在 NodeJS 中更轻松地定义 Worker 线程,就像使用简单异步函数一样。
我们的实现原理非常简单且巧妙,整个npm包是0依赖的,所以你不需要担心引入太多第三方库,这会使你的项目变得臃肿。
安装
npm install define-threads
Github 地址:github.com/YuMao233/de…
有兴趣可以给个 star 或者关注后续发展。
如何使用?
// my-worker.ts
import { createThreadContext } from "define-threads";
// 使用当前文件路径创建线程上下文
// mjs 代码需要把 __filename 替换成 new URL(import.meta.url)
const defineThread = createThreadContext(__filename);
// 线程函数 1
export const calculateLargeSum = defineThread(async (maxNumber: number) => {
// 由一个 worker 线程来执行这里面的代码
// 这里随便写点代码模拟需要耗费大量 CPU 时间的任务
let sum = 0;
for (let i = 0; i < maxNumber; i++) {
sum += i;
}
return sum;
});
// index.ts
import { calculateLargeSum, testFunction } from "./my-worker";
async function main() {
// 像使用简单的异步函数一样使用它们
// TS类型提示是完整的!
const sum = await calculateLargeSum(100);
console.log(sum); // 输出:4950
// 轻而易举的启动了 100 个线程,进行并行计算!
for(let i=0; i < 100; i++) {
calculateLargeSum(i).then((res)=>{
// ...分析结果
})
}
}
main();
这样做的意义何在?
- 极大的减少了定义 Worker 线程所需的代码。
- 可以有效的提升 Worker 线程使用率,轻松的融合到自己的 NodeJS 项目中。
- 可以有效的快速定义一组线程函数,并且组合调用它们,实现并发编程。
缺点
- 无法在前端开发中使用,因为 Worker 需要定义到一个单独的 JS 文件中,由于前端有 Webpack 打包,因此只能在 NodeJS 后端开发中使用。
- 缺少线程池功能,由于 NodeJS 的线程是系统级的线程,会复制传递的参数到内存中,会增加程序整体内存占用。