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?