举例来说,如果要发出两个 AJAX 请求,并且它们之间是彼此独立的,但是需要等待两个请求都完成执行下一步的任务,那么为这个交互建模有两种选择:顺序与并发。
可以先发出第一个请求,然后等待第一个请求结束,之后发出第二个请求。或者,就像我们在 Promise 和 生成器那样,也可以并行发出两个请求,然后用门模式来等待两个请求完成,再继续。
显示,通常最后一种模式会比前一种更高效。而更高的性能通常也会带来更好的用户体验。
Web Worker
如果你有一些处理密集型的任务要执行,但不希望它们都在主线程运行(这可能会减慢浏览器/UI),可能你就会希望 JS 能够以多线程的方式运行。
Javascript 是一种单线程语言。这意味着它有一个 调用堆栈 和一个 堆内存。
Web Worker 新特效,实际上和 JS 语言本身几乎没什么关系。也就是说, JS 当前并没有任何多线程执行的功能。
但是浏览器环境,容易提供多个 JS 引擎实例,各种运行在自己的线程上,这样你可以在每个线程上运行不同的程序。
程序中每一个这样的独立的多线程部分被称为一个 (Web)Worker。
从 JS 主程序(或另一个 Worker)中,可以这样实例化一个 Worker
let w1 = new Worker("Wroker.js");
浏览器启动一个独立的线程,让这个文件在这个线程中作为独立的程序运行。
Worker之间以及它们和主程序之间,不会共享任何作用域或资源。而是通过一个基本消息机制相互联系。
侦听
w1.addEventListener("message",function(evt){
//evt.data
发送
w1.postMessage("something cool to say")
});
Web Worker
- 处理密集型数学计算
- 大数据集排序
- 数据处理(压缩,音频分析,图像处理等)
- 高流量网络通信
Web Worker 让你可以在独立的线程运行一个 JS 文件,使用异步程序事件在线程之间传递消息。它们非常适用于把长时间的或资源密集型的任务卸载到不同的线程中,以提高主 UI 线程的响应性。
SIMD 打算把 CPU 级的并行数学运算映射到 JS API,以获得高性能的数据并行运算,比如在大数据集上的数据处理。