2021-01-27 20:58:40
Web Worker多线程编程的4个关键知识点如下:
消息传递机制
Web Worker通过postMessage和onmessage事件实现主线程与Worker线程间的异步通信。
主线程创建Worker后,通过worker.postMessage()发送数据,Worker通过self.onmessage接收并处理数据,再通过self.postMessage()返回结果。
示例代码:
// 主线程const worker = new Worker('worker.js');worker.onmessage = (event) => { console.log('主线程收到:', event.data); };worker.postMessage({ type: 'calculate', data: 10 });// worker.jsself.onmessage = (event) => { const result = event.data.data * 2; self.postMessage(result);};关键点:self代表Worker的全局作用域,不可使用window对象。

作用域与数据隔离
Worker运行在独立作用域中,无法直接访问主线程的DOM、window对象或变量,确保线程安全。
数据共享方式:
结构化克隆算法:默认方式,复制数据(适用于简单对象)。
Transferable Objects:转移数据所有权(如ArrayBuffer),避免复制开销,提升性能。
示例代码:
// 主线程传递Transferable Objectconst arrayBuffer = new ArrayBuffer(1024);worker.postMessage(arrayBuffer, [arrayBuffer]); // 第二个参数指定转移对象// worker.jsself.onmessage = (event) => { const buffer = event.data; // 主线程无法再访问此buffer};
生命周期管理
终止Worker:
主线程调用worker.terminate()立即停止Worker,释放资源。
Worker内部可通过self.close()关闭自身。
资源泄漏风险:未终止的Worker会持续占用内存和CPU,需在不再需要时及时销毁。
示例代码:
// 主线程终止Workerconst worker = new Worker('worker.js');// ...使用Worker...worker.terminate(); // 立即终止// worker.js内部关闭self.close(); // 终止自身错误处理机制
Worker中的错误不会自动抛出到主线程,需通过onerror事件监听。
两种处理方式:
主线程监听worker.onerror捕获错误。
Worker内部使用try-catch捕获错误,并通过postMessage通知主线程。
示例代码:
// 主线程监听错误const worker = new Worker('worker.js');worker.onerror = (error) => { console.error('Worker错误:', error); };// worker.js内部处理错误try { throw new Error('内部错误'); }catch (error) { self.postMessage({ type: 'error', message: error.message }); }补充知识点:
