首页 > web前端 > js教程 > 正文

什么是JavaScript的Web Workers_它如何实现多线程编程?

夢幻星辰
发布: 2025-12-15 06:01:34
原创
333人浏览过
Web Workers 是基于消息传递的后台线程机制,实现主线程不阻塞的多线程编程;其通过 postMessage/onmessage 通信,数据经结构化克隆复制,支持 Transferable Objects 零拷贝,天然规避竞态条件。

什么是javascript的web workers_它如何实现多线程编程?

Web Workers 是 JavaScript 提供的一种在后台线程中运行脚本的机制,它让开发者能真正实现多线程编程——主线程不被阻塞,耗时任务(如大量计算、数据处理)可交给独立线程执行。

Web Workers 的核心特点

它不是“共享内存式”多线程,而是基于消息传递(message passing)的隔离线程模型:

  • 每个 Worker 运行在独立的全局上下文中,无法直接访问 DOM、window 或 document
  • 主线程与 Worker 之间通过 postMessage()onmessage 通信,数据通过结构化克隆算法复制(非共享引用)
  • Worker 脚本必须来自同源 URL(不能是内联脚本或 data URL)
  • 支持专用 Worker(Dedicated Worker)、共享 Worker(Shared Worker)和 Service Worker,最常用的是 Dedicated Worker

如何创建并使用一个专用 Worker

分两步:编写 Worker 脚本 + 在主线程中实例化并通信:

  • 新建文件 worker.js,写入要后台执行的逻辑,例如:
    self.onmessage = function(e) {<br>  const result = e.data * e.data;<br>  self.postMessage(result);<br>};
    登录后复制
  • 主线程中:
    const worker = new Worker('worker.js');<br>worker.postMessage(123); // 发送数据<br>worker.onmessage = function(e) { console.log('结果:', e.data); };
    登录后复制
  • 注意:Worker 内部用 self 代替 window,可用 fetchsetTimeoutWebAssembly 等,但不能用 alertlocalStorage(部分浏览器限制)

为什么说它“模拟”了多线程而非真正共享内存?

JavaScript 引擎本身是单线程的,V8 等引擎通过操作系统级线程来托管 Worker,但 JS 层面不暴露线程控制权。所有跨线程数据都需序列化/反序列化:

立即学习Java免费学习笔记(深入)”;

iOS开发学习之iOS多线程和RunLoop 中文WORD版
iOS开发学习之iOS多线程和RunLoop 中文WORD版

iOS多线程编程对于iOS开发初学者来说,总是会觉得很难理解和掌握,现在通过几个实例来更加系统全面的理解iOS多线程编程,希望对大家有所帮助。 有些程序是一条直线,起点到终点;有些程序是一个圆,不断循环,直到将它切断。直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样;圆如操作系统,一直运行直到你关机。 一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流。Mac和iOS中的程序启动,创建好一个进程的同时,一个线程便开始运行,

iOS开发学习之iOS多线程和RunLoop 中文WORD版 0
查看详情 iOS开发学习之iOS多线程和RunLoop 中文WORD版
  • 传对象时,只有可克隆属性被复制(函数、undefined、Symbol、Promise 等会被忽略)
  • 大数组可使用 Transferable Objects(如 ArrayBuffer)零拷贝传输,提升性能:worker.postMessage(buffer, [buffer]);
  • 有锁、没有共享变量,天然规避了竞态条件——这也意味着它不适合需要频繁读写同一状态的场景

适用与不适用的场景

适合:图像处理、加密解密、JSON 解析/生成、游戏 AI 计算、离线数据预处理等 CPU 密集型任务。

不适合:需要操作 DOM 的任务(必须回调主线程)、I/O 主导且不耗 CPU 的简单请求(fetch 本身已是异步,无需 Worker)、轻量级逻辑(启动 Worker 有开销,约几毫秒)。

基本上就这些。Web Workers 不复杂但容易忽略它的通信本质——它不是让 JS 变成多线程语言,而是给你开了一个“不打扰用户界面”的新窗口去干活。

以上就是什么是JavaScript的Web Workers_它如何实现多线程编程?的详细内容,更多请关注php中文网其它相关文章!

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号