专职工人和共享工人

专职工人

专用 Web 工作者只能通过调用它的脚本访问。

主要应用:

var worker = new Worker('worker.js');
worker.addEventListener('message', function(msg) {
    console.log('Result from the worker:', msg.data);
});
worker.postMessage([2,3]);

worker.js:

self.addEventListener('message', function(msg) {
    console.log('Worker received arguments:', msg.data);
    self.postMessage(msg.data[0] + msg.data[1]);
});

共享工人

共享工作者可以通过多个脚本访问 - 即使它们被不同的窗口,iframe 甚至工作人员访问。

创建共享工作者与创建专用工作者非常相似,但是不是主线程和工作线程之间的直接通信,而是必须通过端口对象进行通信,即显式端口必须打开,以便多个脚本可以使用它与共享工作者进行通信。 (请注意,专职工作人员隐含地这样做)

主要应用

var myWorker = new SharedWorker('worker.js');
myWorker.port.start();  // open the port connection

myWorker.port.postMessage([2,3]);

worker.js

self.port.start(); open the port connection to enable two-way communication

self.onconnect = function(e) {
    var port = e.ports[0];  // get the port

    port.onmessage = function(e) {
        console.log('Worker revceived arguemnts:', e.data);
        port.postMessage(e.data[0] + e.data[1]);
    }
}

请注意,在工作线程中设置此消息处理程序也会隐式地将端口连接打开回父线程,因此实际上不需要调用 port.start(),如上所述。