Web Worker

Web Worker:
1.这是浏览器(即宿主环境)的功能,浏览器这样的环境,很容易提供多个 JavaScript 引擎实例,
各自运行在自己的线程上,这样你可以在每个线程上运行不同的程序。程序中每一个这样的独立
的多线程部分被称为一个(Web)Worker。这种类型的并行化被称为任务并行,因为其重点在
于把程序划分为多个块来并发运行。

2.实例化一个 Worker:
var wk = new Worker("http://testUrl/myWorker.js");

这个 URL 应该指向一个 JavaScript 文件的位置(而不是一个 HTML 页面!),这个文件将
被加载到一个 Worker 中。然后浏览器启动一个独立的线程,让这个文件在这个线程中作
为独立的程序运行。
Worker 之间以及它们和主程序之间,不会共享任何作用域或资源,那会把所有多线程编程
的噩梦带到前端领域,而是通过一个基本的事件消息机制相互联系。

3.侦听事件与发送事件(固定的 "message" 事件):
wk.addEventListener( "message", function(evt){
// evt.data
} );
发送 "message" 事件给这个 Worker:
wk.postMessage( "something cool to say" );
注意一点,收发消息是完全对称的

4.Worker环境
在 Worker 内部是无法访问主程序的任何资源的。这意味着不能访问它的任何全局变量,也不能访问页面的 DOM 或者其他资源。
可以执行网络操作(Ajax、WebSockets)以及设定定时器。还有,Worker 可以访问几个重要的全局变量和功能的本地复本,
包括 navigator、location、JSON 和applicationCache。

5.共享worker
var sw = new SharedWorker( "http://testUrl/myworker.js" );
共享 Worker 可以与站点的多个程序实例或多个页面连接,所以这个 Worker 需要通过
某种方式来得知消息来自于哪个程序。这个唯一标识符称为端口(port),可以类比网络
socket 的端口。因此,调用程序必须使用 Worker 的 port 对象用于通信,端口连接必须要初始化
在共享 Worker 内部,必须要处理额外的一个事件:"connect"。这个事件为这个特定的连
接提供了端口对象。保持多个连接独立的最简单办法就是使用 port 上的闭包:
// 在共享Worker内部
addEventListener( "connect", function(evt){
// 这个连接分配的端口
var port = evt.ports[0];
port.addEventListener( "message", function(evt){
// ..
port.postMessage( .. );
// ..
} );
// 初始化端口连接
port.start();
} );

 

posted @ 2021-01-28 14:08  你风致  阅读(270)  评论(0编辑  收藏  举报