TaskPool 和 Worker 的對比

作用

  • 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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章