Slide 1

Slide 1 text

Flutter Thread Merge Dart threading changes GDE Dart-Flutter, Flutter Seoul GDG Golang Korea @jaichangpark Dreamwalker

Slide 2

Slide 2 text

Advances and Challenges in Foundation Agents: From Brain-Inspired Intelligence to Evolutionary, Collaborative, and Safe Systems https://arxiv.org/pdf/2504.01990

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

● プロセスは「独立した工場」である。 ● 工場は独立した建物(独立したメモリ空間)を持つ。 ● 1つのプロセスが落ちても、他のプロセスには影響がない。 ○ A工場が崩れても、隣のB工場は影響を受けない。 Process

Slide 5

Slide 5 text

● スレッドは「工場の中で働く従業員」である。 ● プロセスには最低1つのスレッド(メインスレッド)が存在する。 ○ 工場を動かすためには、最低1人以上の従業員が必要である。 ● メモリ(Code・Data・Heap)を共有する。 ○ 従業員は工場内の食堂・倉庫・道具を共有する。 ● スレッドのエラーはプロセス全体を停止させる可能性がある。 ○ 1人の従業員が事故を起こして火事になると、工場全体が停止する。 スレッド Thread

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

動作方式 ● Thread A と Thread B が、同じ変数 count に同時にアクセスして更新できる。 メリット ● データ共有が非常に速い。(ただ読むだけで良い) ● メモリ効率が良い。 デメリット ● 同時実行問題(Race Condition) ○ 複数のスレッドが同時に同じ変数を更新すると値が壊れる。 ● ロックが必要 ○ それを防ぐために「今使っているから待て(Lock)」という制御が必要になる。ロックが複雑になる とデッドロックが発生し、アプリ全体が停止する危険がある Thread A と Thread B が、同じ変数 count に同時にアクセスして更新できる。 メモリ(Heap)を共有する。

Slide 11

Slide 11 text

Dart(Flutter) が採用している独特の並行処理モデルであり、名前の通り 完全に隔離(Isolate) されている。 核心特徴 ● メモリを一切共有しない。 動作方式 ● Isolate A と Isolate B は、完全に独立した別人である。 ● それぞれが独自のメモリ空間(Heap)を持つ。 ● A から B にデータを渡す場合、メッセージ(Message Passing) を使う。 ● このときデータは コピー(Copy) されて送られる。 アイソレート Isolates

Slide 12

Slide 12 text

メリット ● 安全性が高い: メモリ共有がないため、Lock を使う必要がなく、レースコンディションがほ ぼ発生しない。 ● GC(ガベージコレクション)の効率が良い ● A が忙しくて GC が走っても、B は停止せずに処理を続けられる。→ UI のカクつきを防ぎ やすい。 デメリット ● データ転送コスト ○ データをコピーして送るため、1GB の画像など巨大なデータのやり取りは遅くなる。 アイソレート Isolates

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

区分 Thread(一般的) Isolate(Dart / Flutter) メモリ 共有する(Shared Memory) 共有しない(No Shared Memory) 通信方 法 変数に直接アクセス メッセージ通信(Port を利用) 同期 開発者が Lock を管理する(難しい) 不要(自動的に安全) 比喩 同じオフィスで机を共有して働く社員 別々の部屋にいて、電話でやり取りする社 員

Slide 15

Slide 15 text

● プラットフォームスレッド (Platform thread) ● UIスレッド (UI thread) ● ラスタースレッド (Raster thread) ● I/Oスレッド (I/O thread) Flutter uses several threads

Slide 16

Slide 16 text

● プラットフォーム側のメインスレッド。 ● プラグインコードが実行される。 ● Performance Overlay には表示されない。 プラットフォームスレッド Platform thread

Slide 17

Slide 17 text

● Dart コードと Flutter フレームワークが実行されるスレッド。 ● レイヤーツリーを生成し、Raster Thread に送る。 ● ブロックしないこと。 ● Performance Overlay の 下段に表示。 UIスレッド UI thread

Slide 18

Slide 18 text

● レイヤーツリーを受け取り、GPU と連携して描画する。 ● Skia / Impeller がここで動作。 ● 遅い場合は多くが Dart 側の処理の影響。 ● Performance Overlay の 上段に表示。 ラスタースレッド Raster thread

Slide 19

Slide 19 text

● ファイル、画像デコード、ネットワークなど重い I/O を担当。 ● UI / Raster をブロックしないための作業用スレッド。 ● Performance Overlay には表示されない。 I/Oスレッド I/O thread

Slide 20

Slide 20 text

DEMO Flutter < 3.29

Slide 21

Slide 21 text

final result = await applyFilterAsync(imageData: _imageBytes!); final result = applyFilterSync(imageData: _imageBytes!);

Slide 22

Slide 22 text

ASYNC SYNC

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

https://blog.flutter.dev/whats-new-in-flutter-3-29-f90c380c2317

Slide 26

Slide 26 text

Platform Thread (Kotlin, Swift) UI Thread (Dart Code) Raster Thread (C++)

Slide 27

Slide 27 text

問題 ● 従来は、非常に簡単なプラットフォーム情報(例:バッテリー残量の取得、ファイ ル存在確認)であっても、 ● UI スレッド ↔ Platform スレッド の通信が必要であった。 0.001ms で終わる処理でも、スレッドをまたぐ必要があり、強制的に async/await を使わざるを得なかった。

Slide 28

Slide 28 text

Platform Thread Raster Thread Kotlin Swift Dart Code

Slide 29

Slide 29 text

DEMO Flutter >= 3.29

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

ASYNC SYNC

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

軽量タスク ● Main Thread でそのまま実行する。 ● 例:バッテリー確認、キャッシュ参照、簡単な計算、短時間で終わる FFI 呼び出 し。 重量タスク(> 1ms) ● 必ず Isolate に送る。 ● 例:ファイル I/O、画像処理、ネットワーク要求、データベース検索。

Slide 35

Slide 35 text

Thank You!