众所周知,JavaScript 是单线程的:所有代码都排队并按顺序执行。
使用 Web Workers,我们可以同时运行 JavaScript 进程(或者至少,在这种语言允许的情况下尽可能接近并发)。这种方法的主要好处是在不干扰用户界面的情况下处理后台线程中的数据操作。
使用网络工作者:
Web Workers 允许您在网页上并行运行 JavaScript,而不会阻塞用户界面。
- Web 工作者在单独的线程中执行
- 需要将所有工作代码托管在单独的文件中
- 它们不会自动进行垃圾回收,因此您需要控制它们。
- 运行worker useworker.postMessage(“”);
- 要停止工作程序,调用者代码有两个方法sterminate()
andclose() 来自 Worker 本身
- 实例化 worker 会消耗一些内存。
Web Worker 在一个独立的线程中运行。因此,他们执行的代码需要包含在单独的文件中。但在我们这样做之前,首先要做的是在您的主页中创建一个 newWorkerobject。构造函数采用工作脚本的名称:
var worker = new Worker('task.js');
如果指定的文件存在,浏览器会产生一个新的工作线程,它是异步下载的。在文件完全下载并执行之前,worker 不会开始。如果您的工作人员的路径返回 404,工作人员将静默失败。
创建worker后,调用postMessage()方法启动它:
worker.postMessage(); // Start the worker.
通过消息传递与 Worker 通信
作品与其父页面之间的通信是使用事件模型和 postMessage() 方法完成的。根据您的浏览器/版本,postMessage() 可以接受字符串或 JSON 对象作为其单个参数。现代浏览器的最新版本支持传递 JSON 对象。
下面是使用字符串将“Hello World”传递给 doWork.js 中的工作人员的示例。 worker 只是返回传递给它的消息。
主脚本:
var worker = new Worker('doWork.js');
worker.addEventListener('message', function(e) {
console.log('Worker said: ', e.data);
}, false);
worker.postMessage('Hello World'); // Send data to our worker.
doWork.js(工人):
self.addEventListener('message', function(e) {
self.postMessage(e.data); // Send data back to main script
}, false);
当从主页调用postMessage() 时,我们的工作人员通过为messageevent 定义anonmessagehandler 来处理该消息。消息负载(在本例中为“Hello World”)可在Event.data 中访问。这个例子展示了 postMessage() 也是你将数据传回主线程的方法。方便!
参考资料:
http://www.tothenew.com/blog/multi-threading-in-javascript-using-web-workers/
https://www.html5rocks.com/en/tutorials/workers/basics/
https://dzone.com/articles/easily-parallelize-jobs-using-0