NodeJS 并发编程:更轻松的定义和使用 Worker

141 阅读2分钟

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

这样做的意义何在?

  1. 极大的减少了定义 Worker 线程所需的代码。
  2. 可以有效的提升 Worker 线程使用率,轻松的融合到自己的 NodeJS 项目中。
  3. 可以有效的快速定义一组线程函数,并且组合调用它们,实现并发编程。

缺点

  1. 无法在前端开发中使用,因为 Worker 需要定义到一个单独的 JS 文件中,由于前端有 Webpack 打包,因此只能在 NodeJS 后端开发中使用。
  2. 缺少线程池功能,由于 NodeJS 的线程是系统级的线程,会复制传递的参数到内存中,会增加程序整体内存占用。