当前位置:首页 > JavaScript

js实现线程池

2026-04-07 11:24:06JavaScript

实现线程池的基本概念

JavaScript 是单线程语言,但通过 Web Workers 可以实现多线程。线程池(Thread Pool)是一种管理多个 Worker 线程的机制,用于优化资源利用和任务调度。

使用 Web Workers 创建线程池

Web Workers 允许在后台运行脚本,独立于主线程。以下是一个简单的线程池实现:

class ThreadPool {
  constructor(size) {
    this.size = size;
    this.workers = [];
    this.taskQueue = [];
    this.initializeWorkers();
  }

  initializeWorkers() {
    for (let i = 0; i < this.size; i++) {
      const worker = new Worker('worker.js');
      worker.onmessage = (event) => {
        this.handleWorkerResponse(worker, event);
      };
      this.workers.push(worker);
    }
  }

  handleWorkerResponse(worker, event) {
    const taskCallback = this.taskQueue.shift();
    if (taskCallback) {
      worker.postMessage(taskCallback.data);
    }
  }

  executeTask(data, callback) {
    if (this.workers.length > 0) {
      const worker = this.workers.pop();
      worker.postMessage(data);
      worker.onmessage = (event) => {
        callback(event.data);
        this.workers.push(worker);
        this.processQueue();
      };
    } else {
      this.taskQueue.push({ data, callback });
    }
  }

  processQueue() {
    if (this.taskQueue.length > 0 && this.workers.length > 0) {
      const { data, callback } = this.taskQueue.shift();
      this.executeTask(data, callback);
    }
  }
}

Worker 脚本示例

创建 worker.js 文件,用于处理实际任务:

self.onmessage = function(event) {
  const result = performTask(event.data);
  self.postMessage(result);
};

function performTask(data) {
  // 模拟耗时任务
  return data * 2;
}

使用线程池

在主线程中初始化并使用线程池:

js实现线程池

const pool = new ThreadPool(4);

pool.executeTask(10, (result) => {
  console.log('Task result:', result);
});

pool.executeTask(20, (result) => {
  console.log('Task result:', result);
});

优化线程池

  1. 错误处理:添加 Worker 的 onerror 事件处理,确保任务失败时有备用方案。
  2. 任务优先级:扩展 taskQueue 支持优先级队列,高优先级任务优先执行。
  3. 动态调整:根据系统负载动态增加或减少 Worker 数量。

注意事项

  • Web Workers 不能直接操作 DOM,需通过 postMessage 通信。
  • 大量 Worker 可能消耗较多内存,需合理设置池大小。
  • 部分浏览器可能限制同时激活的 Worker 数量。

标签: 线程js
分享给朋友:

相关文章

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…