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,在記憶體不多的手機上,是無法完成傳遞的
改善#
- 減少 isolate 創建,降低消耗
- 減少 message 傳遞次數,以及資料大小
LoadBalancer#
- 創建一個隔離池(thread pool),固定使用相同的 Isolates 處理任務、進行運算,不需要每次都消耗記憶體
- 自動實現負載平衡
- 可以自定義一個
Singleton-Class負責 LoadBalancer 的實體與操作,有繁重的任務時都交給它處理(不過主要還是看專案的需求)
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()#
- 停止所有在處理的任務,並釋放資源
範例#
參考#
其他文章#
- 提高Flutter性能的小技巧!(一)
- 提高Flutter性能的小技巧!(二)
- What are Async and Isolates in Flutter?
- Flutter 3 有什麼新東西?
- Riverpod 輕鬆學,原來這麼好用!
- Riverpod 輕鬆學(二),一些進階用法!
關於我#
- Github:chyiiiiiiiiiiii
- Linkedin:yiichenhi
- Youtube:Yii
- Youtube:一起饅頭(美食頻道)
- Instagram:yiichenhi
- Email:ab20803@gmail.com
贊助#
謝謝你!這是一個很長的文章而且你花費時間看完,真的非常感謝。
還有一件事, 如果覺得文章不錯可以贊助我,讓我有更多的動力和熱情分享 學習筆記和生活!請我喝一杯咖啡吧~
最後#
希望有幫助到你/妳,歡迎追蹤我,方便瀏覽最新的文章,也請別忘記給我拍手哦 (最多可以達到50次)!
本文原刊登於 Medium。