iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

在今天以前所介紹的都是一般較常用到的 Dedicated workerDedicated worker 只能被當下創建的線程使用,而 Shared worker 則是只要符合同源的網域下,任意不同的 window, iframe 或甚至是其他的 worker 線程都可以使用它。

建立 Shared worker 並傳送訊息

Shared worker 藉由 第 10 天介紹到的 MessagePort 達到不同線程之間的溝通,所以需要使用 port 對象傳遞訊息

// 主線程
const worker = new SharedWorker('worker.js');
worker.port.postMessage(1);

Shared worker 接收訊息

不同於 Dedicated worker 只需要使用 onmessage 接收訊息,Shared worker 需要在 worker 連接上的時候先呼叫 onconnect 方法,取得連接到 workerport 後,再使用 port 去接收或送出訊息

另外使用 port.addEventListener 或是 port.onmessage 接收訊息時有個小地方需要注意, port.addEventListener 的寫法接收訊息,一定要呼叫 port.start(),才有辦法順利收到訊息,但使用 port.onmessage 方式的寫法,底層會自動呼叫 start(),就不用特別寫出來

例如,以下兩段程式碼是等價的:

self.onconnect = (e) => {
  const port = e.ports[0];

  port.addEventListener('message', (e) => {
    port.postMessage(e.data);
  });

  port.start();
};
self.onconnect = (e) => {
  const port = e.ports[0];

  port.onmessage = (e) => {
    port.postMessage(e.data);
  };
};

主線程接收訊息

跟上面提到的一樣,當使用 addEventListener('message') 的寫法時,port 連線不會自動建立,需要呼叫 port.start() 才能正確收到訊息

worker.port.onmessage = (e) => {
  console.log(e.data);
};
worker.port.addEventListener('message', (e) => {
  console.log(e.data);
});

worker.port.start();

Shared worker 與 Dedicated worker 的生命週期

Dedicated worker 每次創建時都會是一個新的 worker,只能被創建當下的線程所使用,但 Shared worker 不論被創建了多少次,所有頁面(tab) 都是共用同一個 worker,以下表格統整 不同事件 所產生的 總 worker 數量

Dedicated worker

const worker = new Worker('/worker.js');
事件 結果 總共 worker 數量
tab1 創建 worker 產生 worker1 1
tab2 創建 worker 產生 worker2 2
關閉 tab1 終止 worker1 1
關閉 tab2 終止 worker2 0

Shared worker

const worker = new SharedWorker('/shared-worker.js');
事件 結果 總共 worker 數量
tab1 創建 shared worker 產生 shared worker1 1
tab2 創建 shared worker 產生 shared worker2 1
關閉 tab1 終止 shared worker1 1
關閉 tab2 終止 shared worker2 0

小結

只要是同源的網域下都可以共用同一個 Shared worker,因此 Shared worker 的生命週期也與 Dedicated worker 不同,不論 Shared worker 被創建了幾次,指向的都是同一個 Shared worker

Reference

SharedWorker
The secret of successfully using multi window WebGL Canvas
JavaScript Web Workers(三)共享Worker


上一篇
在 Web worker 中使用 OffscreenCanvas
下一篇
Shared worker 的生命週期
系列文
網頁的另一個大腦:從基礎到進階掌握 Web Worker 技術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言