Advanced isolate usage in flutter

Daniel Kao
3 min readMay 17, 2020

--

雖然標題是英文,內文還是用中文撰寫,造福一下看中文資訊的讀者。

在 flutter 中,如果遇到花時間的 task,小一點的 task 可以直接利用 async function 把這件事延後到 event loop後面;大一點的 task,則是建議利用 isolate,將它交給獨立的 isolate 處理完後,再送回主要的 UI thread。

dart 本身也知道 isolate 的寫法很煩瑣,所以特地包了一個 compute 的 function 讓開發者可以很快地將想處理的邏輯包在一個 top level function 中,再將它丟給 compute 就行。關於 isolate 和 compute的使用方式,可以參考我之前的一篇文章:

compute 在使用上相當無腦,卻也不是萬靈丹。它底層還是會去建立新的 isolate,處理完 task 後再把該 isolate 砍掉。每次建立 isolate 的成本是很高的,可能需要花費 50 到 150 ms 的時間。如果同一個畫面中有多張圖片要處理,或是透過 isolate 方式在處理多個網路 request 的 response parsing。將會產生許多 isolate 開開關關造成不必要的資源浪費和時間上的延遲。

這時,其實不難想到,如果能有個類似 thread pool 的機制就好了:透過固定產生幾個 isolate 在那,由這幾個 isolate 輪流去處理不斷進來的需求。

isolate 這個 plugin 也為大家準備好了這樣子的solution,稱為 loadBalancer。先來看一下如果是 compute 的話,可以怎麼寫。在第 6 行利用 compute 執行 processImage function。

下面是利用 LoadBalancer 的例子。利用 Loadbalancer 的話,主要是第 2行的建立 LoadBalancer instance,在第 9 行般取得資源,然後透過 loadBalancer.run() 執行 task。

下面是套用了 LoadBalancer 的 Flutter App 的表現。

相關文章

--

--

Daniel Kao

2023 年新書出版! Android 開源專案「真」實戰啟航:瀏覽器 App EinkBro 開發者帶你逐步從 UI 設計、UX 提升到多功能實現秘技全解析