Worker Thread

大部分 API 均與前端 web worker 相同,用來有效處理 CPU bound 的資料。

相關特性

1.多個 worker 不能同時存取主程式相同變數,所以不會有 race condition 問題,透過 postMessage 讓 worker 傳訊息給主程式。

2.假設是通過 postMessage 傳遞 Object ,建議先 JSON.stringify 然後 parse,速度會較快。

範例

app.js

worker.js

之後執行 node app.js

Worker 搭配 Promise all

讓所有 worker 都執行完畢後再繼續程式

我們先看一下原本的 single thread 程式

耗時大約 10s

然後我們把它改成 worker_thread 版本,並搭配 Promise

把原本的 2000000 個部分,分給四個 thread 計算。

app.js

worker.js

耗時大約 5s

使用 microjob module

發現比原本原生的更慢,可以查看issue: https://github.com/wilk/microjob/issues/65

Share memory

可以用 Share memory 的方法來傳遞參數,取代 postMessage,速度會比較快。

app.js

worker.js

平均速度約 90ms

假設換回原本 postMessage方式

app.js

worker.js

可發現需要耗時 150ms 左右,約為 share memory 的兩倍。

資料序列化的時間

假設我們把原本 share memory 範例的 sharedArrayBuffer 在最後拿到資料後全部轉為 array 可發現時間又變回 150ms 左右,所以大部分時先是花在資料的序列化。

Atomics

使用 share memory 時為了避免存取相同記憶體產生 race condition,可以使用

Worker 間通訊

Last updated

Was this helpful?