π§΅ Isolates & Δa luα»ng
Dart lΓ ngΓ΄n ngα»― single-threaded nhΖ°ng vαΊ«n cΓ³ thα» xα» lΓ½ concurrent tasks thΓ΄ng qua Isolates. Hiα»u vα» Isolates giΓΊp bαΊ‘n xΓ’y dα»±ng α»©ng dα»₯ng Flutter mượt mΓ vα»i cΓ‘c tΓ‘c vα»₯ nαΊ·ng.
1. Dart Single-Threaded Model
PhαΊ§n tiΓͺu Δα» β1. Dart Single-Threaded Modelβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ DART EXECUTION MODEL ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ Dart code chαΊ‘y trong Mα»T thread duy nhαΊ₯t (Main Isolate) ββ ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β MAIN ISOLATE β ββ β β ββ β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββ β β EVENT LOOP β β ββ β β β β ββ β β βββββββββββββ βββββββββββββ β β ββ β β β Microtask β ββββΆ β Event β β β ββ β β β Queue β β Queue β β β ββ β β βββββββββββββ βββββββββββββ β β ββ β β β β β β ββ β β Futures, UI events, β β ββ β β async/await I/O callbacks, β β ββ β β Timer callbacks β β ββ β β β β ββ β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββ β β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ ββ Single-threaded = TαΊ₯t cαΊ£ code Dart chαΊ‘y lαΊ§n lượt, khΓ΄ng song song ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ2. VαΊ₯n Δα» vα»i Single Thread
PhαΊ§n tiΓͺu Δα» β2. VαΊ₯n Δα» vα»i Single Threadβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ BLOCKING THE UI THREAD ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ β Khi chαΊ‘y tΓ‘c vα»₯ nαΊ·ng trΓͺn Main Isolate: ββ ββ Frame 1 Frame 2 Frame 3 Frame 4 Frame 5 ββ βββββββββ βββββββββ βββββββββ βββββββββ βββββββββ ββ β Paint β β Paint β β β β β β Paint β ββ βββββββββ βββββββββ β HEAVY β β TASK β βββββββββ ββ β TASK β β ... β ββ OK OK β ... β β β OK ββ βββββββββ βββββββββ ββ β ββ JANK! ββ UI bα» ΔΓ³ng bΔng ββ ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β CΓ‘c tΓ‘c vα»₯ nαΊ·ng: β ββ β β’ JSON parsing lα»n β ββ β β’ Image processing β ββ β β’ Encryption/Decryption β ββ β β’ Complex calculations β ββ β β’ File compression β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ3. Isolate lΓ gΓ¬?
PhαΊ§n tiΓͺu Δα» β3. Isolate lΓ gΓ¬?βIsolate lΓ mα»t execution context Δα»c lαΊp vα»i:
- RiΓͺng memory heap
- RiΓͺng event loop
- KhΓ΄ng chia sαΊ» state vα»i cΓ‘c Isolates khΓ‘c
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ISOLATES ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ βββββββββββββββββββββββ βββββββββββββββββββββββ ββ β MAIN ISOLATE β β WORKER ISOLATE β ββ β β β β ββ β βββββββββββββββββ β β βββββββββββββββββ β ββ β β Memory β β β β Memory β β ββ β β Heap β β β β Heap β β ββ β βββββββββββββββββ β β βββββββββββββββββ β ββ β β β β ββ β βββββββββββββββββ β β βββββββββββββββββ β ββ β β Event Loop β β β β Event Loop β β ββ β βββββββββββββββββ β β βββββββββββββββββ β ββ β β β β ββ ββββββββββββ¬βββββββββββ ββββββββββββ¬βββββββββββ ββ β β ββ β MESSAGES β ββ βββββββββββββββββββββββββββββ ββ (SendPort/ReceivePort) ββ ββ β οΈ KhΓ΄ng thα» chia sαΊ» objects trα»±c tiαΊΏp ββ β οΈ Giao tiαΊΏp qua message passing ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ4. Isolate vs Thread
PhαΊ§n tiΓͺu Δα» β4. Isolate vs Threadβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ISOLATE vs THREAD βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ€β THREAD β ISOLATE βββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββ€β β ββ Shared memory β Separate memory ββ ββββββββββ ββββββββββ β ββββββββββ ββββββββββ ββ βThread 1β βThread 2β β βIsolate1β βIsolate2β ββ βββββ¬βββββ βββββ¬βββββ β ββββββββββ ββββββββββ ββ β β β β β ββ ββββββ¬ββββββ β β β ββ βΌ β βΌ βΌ ββ ββββββββββ β ββββββββββ ββββββββββ ββ β Shared β β β Memory β β Memory β ββ β Memory β β β A β β B β ββ ββββββββββ β ββββββββββ ββββββββββ ββ β ββ β Race conditions! β β No race conditions! ββ β Locks needed β β No locks needed ββ β Deadlock possible β β Message passing ββ β βββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββ5. CΓ‘ch sα» dα»₯ng Isolates
PhαΊ§n tiΓͺu Δα» β5. CΓ‘ch sα» dα»₯ng Isolatesβ5.1 Compute (Simple)
PhαΊ§n tiΓͺu Δα» β5.1 Compute (Simple)βCho tΓ‘c vα»₯ ΔΖ‘n giαΊ£n, dΓΉng compute():
// Heavy function (chαΊ‘y trong isolate khΓ‘c)int heavyComputation(int value) { var result = 0; for (var i = 0; i < value * 1000000; i++) { result += i; } return result;}
// Gα»i tα»« UIvoid processData() async { // ChαΊ‘y trong isolate riΓͺng, UI khΓ΄ng bα» block final result = await compute(heavyComputation, 1000); print('Result: $result');}5.2 Isolate.run (Dart 2.19+)
PhαΊ§n tiΓͺu Δα» β5.2 Isolate.run (Dart 2.19+)βvoid processData() async { final result = await Isolate.run(() { // Code nΓ y chαΊ‘y trong isolate khΓ‘c return heavyComputation(1000); }); print('Result: $result');}5.3 Long-running Isolate (Manual)
PhαΊ§n tiΓͺu Δα» β5.3 Long-running Isolate (Manual)β// Cho tΓ‘c vα»₯ phα»©c tαΊ‘p, cαΊ§n giao tiαΊΏp liΓͺn tα»₯clate Isolate _isolate;late ReceivePort _receivePort;late SendPort _sendPort;
void startWorker() async { _receivePort = ReceivePort(); _isolate = await Isolate.spawn(workerFunction, _receivePort.sendPort);
// NhαΊn SendPort tα»« worker _sendPort = await _receivePort.first as SendPort;}
static void workerFunction(SendPort mainSendPort) { final workerReceivePort = ReceivePort(); mainSendPort.send(workerReceivePort.sendPort);
workerReceivePort.listen((message) { // Xα» lΓ½ message tα»« main final result = heavyComputation(message); mainSendPort.send(result); });}6. Message Passing
PhαΊ§n tiΓͺu Δα» β6. Message Passingβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ MESSAGE PASSING ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ βββββββββββββββββββββββ βββββββββββββββββββββββ ββ β MAIN ISOLATE β β WORKER ISOLATE β ββ β β β β ββ β SendPort ββββββββββββββββββΆ ReceivePort β ββ β (send messages) β β (receive messages) β ββ β β β β ββ β ReceivePort ββββββββββββββ SendPort β ββ β (receive results) β β (send results) β ββ β β β β ββ βββββββββββββββββββββββ βββββββββββββββββββββββ ββ ββ β οΈ Messages Δược COPY, khΓ΄ng phαΊ£i shared reference ββ ββ CΓ³ thα» gα»i: ββ βββ Primitive types (int, double, String, bool) ββ βββ Lists vΓ Maps (vα»i primitive values) ββ βββ SendPort/ReceivePort ββ βββ TypedData (Uint8List, etc.) ββ βββ TransferableTypedData (zero-copy transfer) ββ ββ KhΓ΄ng thα» gα»i: ββ βββ Closures ββ βββ Objects vα»i state phα»©c tαΊ‘p ββ βββ UI widgets, BuildContext ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ7. Khi nΓ o dΓΉng Isolate?
PhαΊ§n tiΓͺu Δα» β7. Khi nΓ o dΓΉng Isolate?βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ DECISION TREE ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ TΓ‘c vα»₯ mαΊ₯t bao lΓ’u? ββ β ββ βββββββββββββ΄ββββββββββββ ββ β β ββ < 16ms > 16ms ββ β β ββ βΌ βΌ ββ ββββββββββββββββ ββββββββββββββββββββββββ ββ β Main Isolate β β CαΊ§n Isolate riΓͺng? β ββ β OK! β β β ββ ββββββββββββββββ ββββββββββββ¬ββββββββββββ ββ β ββ ββββββββββββββββ΄βββββββββββββββ ββ β β ββ One-time Long-running ββ calculation worker ββ β β ββ βΌ βΌ ββ ββββββββββββββββ ββββββββββββββββ ββ β compute() or β β Isolate.spawnβ ββ β Isolate.run()β β with ports β ββ ββββββββββββββββ ββββββββββββββββ ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ8. Isolate trong Flutter
PhαΊ§n tiΓͺu Δα» β8. Isolate trong Flutterβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ FLUTTER THREADING MODEL ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β MAIN ISOLATE (UI Thread) β ββ β β ββ β βββ Widget building β ββ β βββ Layout β ββ β βββ Paint β ββ β βββ Event handling β ββ β βββ Flutter framework code β ββ β β ββ β β οΈ KHΓNG Δược block thread nΓ y! β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β ENGINE THREADS (Native) β ββ β β ββ β βββ Raster Thread (GPU rendering) β ββ β βββ IO Thread (asset loading, image decoding) β ββ β βββ Platform Thread (native channels) β ββ β β ββ β β Managed by Flutter, khΓ΄ng cαΊ§n developer can thiα»p β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β USER ISOLATES (Optional) β ββ β β ββ β βββ JSON parsing β ββ β βββ Image processing β ββ β βββ Encryption β ββ β βββ Database operations β ββ β βββ Complex calculations β ββ β β ββ β β Developer tαΊ‘o khi cαΊ§n β ββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ9. Practical Examples
PhαΊ§n tiΓͺu Δα» β9. Practical ExamplesβJSON Parsing
PhαΊ§n tiΓͺu Δα» βJSON Parsingβ// β Bad: Parse JSON trΓͺn main isolatefinal data = jsonDecode(largeJsonString);
// β
Good: Parse trong isolate riΓͺngfinal data = await compute(jsonDecode, largeJsonString);Image Processing
PhαΊ§n tiΓͺu Δα» βImage Processingβ// Heavy image processingFuture<Uint8List> processImage(Uint8List imageBytes) async { return await compute(_doProcessing, imageBytes);}
Uint8List _doProcessing(Uint8List bytes) { // Apply filters, resize, etc. // Runs in separate isolate return processedBytes;}π TΓ³m tαΊ―t
PhαΊ§n tiΓͺu Δα» βπ TΓ³m tαΊ―tβ| Concept | Description |
|---|---|
| Single-threaded | Dart code chαΊ‘y trΓͺn 1 thread duy nhαΊ₯t |
| Event Loop | XỠlý events và microtasks lần lượt |
| Isolate | Execution context riΓͺng biα»t |
| Message Passing | CΓ‘ch giao tiαΊΏp giα»―a Isolates |
| Use Case | Solution |
|---|---|
| Quick one-time task | compute() or Isolate.run() |
| Long-running worker | Isolate.spawn() with ports |
| Simple async | async/await (no isolate needed) |
Quy tαΊ―c vΓ ng:
NαΊΏu tΓ‘c vα»₯ mαΊ₯t hΖ‘n 16ms (1 frame @ 60fps), hΓ£y cΓ’n nhαΊ―c dΓΉng Isolate Δα» trΓ‘nh jank UI.