作用:
- TaskPool(任務池)和 Worker 都爲應用程序提供多線程運行環境,用於處理耗時的計算任務或其他密集型任務,避免阻塞主線程,提高系統性能。
實現特點對比:
- 內存模型:TaskPool 和 Worker 都提供線程間隔離,內存不共享。
- 參數傳遞機制:兩者都採用結構化克隆算法進行序列化、反序列化,完成參數傳遞,並支持 ArrayBuffer 轉移和 SharedArrayBuffer 共享。
- 參數傳遞:TaskPool 直接傳遞參數,無需封裝,默認進行 transfer;Worker 需要自己封裝消息對象作爲唯一參數。
- 方法調用:TaskPool 直接將方法傳入調用;Worker 在線程中進行消息解析並調用對應方法。
- 返回值:TaskPool 異步調用後默認返回;Worker 主動發送消息,需在 onmessage 解析賦值。
- 生命週期:TaskPool 自行管理生命週期;開發者自行管理 Worker 的數量及生命週期。
- 任務池個數上限:TaskPool 自動管理,無需配置;同個進程下,Worker 最多支持同時開啓 8 個線程。
- 任務執行時長上限:兩者均無限制。
- 設置任務的優先級:兩者都不支持。
- 執行任務的取消:TaskPool 支持取消任務隊列中等待的任務;Worker 不支持。
適用場景對比:
- TaskPool 適合獨立任務維度,超長任務會被系統自動回收;Worker 適合長時間佔據線程執行,需要主動管理線程生命週期的場景。
TaskPool 運作機制:
- 支持在主線程封裝任務拋給任務隊列,系統選擇合適的工作線程進行任務分發及執行,並將結果返回給主線程。
Worker 運作機制:
- 創建 Worker 的線程稱爲宿主線程,Worker 子線程與宿主線程擁有獨立的實例,通信基於消息傳遞。
注意事項:
- TaskPool 和 Worker 實現的任務函數需要使用裝飾器標註,且入參需滿足序列化支持的類型。
- 實現任務的函數需要使用裝飾器@Concurrent標註,且僅支持在.ets文件中使用。
- Worker創建後需要手動管理生命週期,且最多同時運行的Worker子線程數量爲8個。
- Ability類型的Module支持使用Worker,Library類型的Module不支持使用Worker。
- 創建Worker不支持使用其他Module的Worker.ts文件,即不支持跨模塊調用Worker。
- 由於不同線程中上下文對象是不同的,兩者工作線程只能使用線程安全的庫。
- 序列化傳輸的數據量大小限制爲 16MB。