//主线程
var worker = new Worker(‘./worker.js‘)
//向Worker发消息
worker.postMessage(‘hello world‘)
worker.postMessage({method:‘echo‘, args:[‘work‘]})
//监听消息
worker.onmessage = function(event) {
console.log(‘Received message‘ + event.data)
doSomething()
}
function doSomething() {
//执行任务
worker.postMessage(‘Work done!‘)
//结束线程
worker.terminate()
}
//子线程
//发送消息
this.postMessage(‘get it!‘)
//self代表子线程自身,即子线程的全局对象。因此,等同于下面两种写法
self.addEventListener(‘message‘, function (e) {
self.postMessage(‘You said: ‘ + e.data);
}, false);
//写法一
//监听消息
this.addEventListener(‘message‘, function(event) {
this.postMessage(‘You said‘ + event.data)
}, false)
// 写法二
addEventListener(‘message‘, function (e) {
postMessage(‘You said: ‘ + e.data);
}, false);
//根据主线程发来的数据,Worker 线程可以调用不同的方法,下面是一个例子。
self.addEventListener(‘message‘, function (e) {
var data = e.data;
switch (data.cmd) {
case ‘start‘:
self.postMessage(‘WORKER STARTED: ‘ + data.msg);
break;
case ‘stop‘:
self.postMessage(‘WORKER STOPPED: ‘ + data.msg);
self.close(); // Terminates the worker.
break;
default:
self.postMessage(‘Unknown command: ‘ + data.msg);
};
}, false);
//加载单个
importScripts(‘script1.js‘)
//加载多个
importScripts(‘script2.js‘, ‘script3.js‘)
worker.onerror(function (event) {
console.log([
‘ERROR: Line‘, e.lineno, ‘in ‘, e.filename, ‘:‘, e.message
].join(‘‘)
)
})
//或者
worker.addEventListener(‘error‘, function(event){
//...
})
//使用完毕,为了节省系统资源,要及时关闭Worker
//主线程
worker.terminate()
//Worker线程
self.close()
注意点:拷贝方式发送二进制数据会造成性能问题。比如主线程向Worker发送一个500MB的文件,默认情况下浏览器会生成一个源文件的拷贝。
为了解决这个问题,JavaScript允许主线程把二进制数据直接转移给子线程,但是一旦转移,主线程就无法再使用这些二进制数据了,这是为了防止出现多个线程同时修改数据的麻烦局面。
这种转移数据的方法,叫做Transferable Objects。这使主线程可以快速将数据交给Worker,对于影像处理、声音处理、3D运算等就非常方便了,不会产生性能负担。
//直接转移数据的控制权,使用下面的写法:
worker.postMessage(arrayBuffer, [arrayBuffer])
//例如
var ab = new ArrayBuffer(1)
worker.postMessage(ab, [ab])
<!DOCTYPE html>
<html>
<body>
<!--worker线程-->
<script id = "worker" type="app/worker">
addEventListener(‘message‘, function(){
postMessage(‘some message‘)
}, false)
</script>
<!--主线程-->
<script>
var blob = new Blob([document.querySelector(‘#worker‘).textContent])
var url = window.URL.createObjectURL(blob)
var worker = new Worker(url)
worker.onmessage = function(e) {
//e.tata === ‘some message‘
}
</script>
</body>
</html>
参考链接:http://www.ruanyifeng.com/blog/2018/07/web-worker.html
原文:https://www.cnblogs.com/HappyYawen/p/14324226.html