yii.
← Writing
Flutter 技術 · · 3 min read

LoadBalancer is optimization for Isolates in Flutter

這篇寫於 2022 年。工具和 API 變化很快,部分步驟可能已經不適用。

Isolate pool is good


說明#

如果有遇到圖片或大量資料要處理,通常想到的會是使用Isolate,請background worker幫忙,最後將結果返回UI thread進行畫面更新,從而減輕主線程的負擔。

不管是透過spawn()或是compute() 都會經過 Isolate 的創建與銷毀,這時如果需要頻繁處理複雜的任務就會有很大的消耗,而這樣做會有一些代價。

問題1:時間#

  • 使用多線程的時候,整個計算時間會比單線程多
  • 創建 Isolate 、銷毀與傳遞資料,可能會耗費約 50-150ms 的時間

問題2:空間#

  • 實際上 Isolate 是佔空間的,每當創建出來至少需要 2MB 左右甚至更多,取決於工作內容
  • 實作上可能會使用message參數傳遞大量資料或檔案,而資料會經歷一次 copy ,這其實就存在著 OOM 風險
  • 如果說想要返回一個幾GB的data,在記憶體不多的手機上,是無法完成傳遞的

改善#

  1. 減少 isolate 創建,降低消耗
  2. 減少 message 傳遞次數,以及資料大小

LoadBalancer#

  • 創建一個隔離池(thread pool),固定使用相同的 Isolates 處理任務、進行運算,不需要每次都消耗記憶體
  • 自動實現負載平衡
  • 可以自定義一個 Singleton-Class 負責 LoadBalancer 的實體與操作,有繁重的任務時都交給它處理(不過主要還是看專案的需求)

isolates | Dart PackageHelps with isolates and isolate communication in Dart. Requires the dart:isolate library being available. Isolates are…pub.dev

create()#

  • 創建隔離池
  • 第一個參數 → 提供指定數量的 Isolates
  • 剛開始創建的時候只會存在一個 Isolate,當執行 run() 之後才會創建其他出來

run()#

Future<R> run<R, P>(FutureOr<R> function(P argument), argument)
  • 第一個參數 → 要在 Isolate 進行處理和運算的函式,函式可附帶一個參數
  • 第二個參數 → 函式的參數資料
  • 和 compute() 操作上差不多,但是當頻繁使用 Isolate 的時候,就不再需要重建了,可節省成本

runMultiple()#

  • 第一個參數 → Isolate數量,使用負載最少的幾個 Isolates 處理相同函式,例如:指定3個,就會得到3個運算結果
  • count 不允許設置超過池子裡的 Isolates 總數,因此保證函式不會在同一個隔離中運行兩次

close()#

  • 停止所有在處理的任務,並釋放資源

範例#

GitHub - chyiiiiiiiiiiii/dart_isolate_loadbalancer: Use LoadBalancer to handle heavy tasks…If the app needs to use isolates frequently doing some heavy computations, we can use LoadBalancer to create an…github.com

參考#


其他文章#

關於我#

贊助#

謝謝你!這是一個很長的文章而且你花費時間看完,真的非常感謝。

還有一件事, 如果覺得文章不錯可以贊助我,讓我有更多的動力和熱情分享 學習筆記和生活!請我喝一杯咖啡吧~

https://www.buymeacoffee.com/yiichenhi

最後#

希望有幫助到你/妳,歡迎追蹤我,方便瀏覽最新的文章,也請別忘記給我拍手哦 (最多可以達到50次)!

本文原刊登於 Medium。