Appearance
dart-event-loop-isolate
1. 实验目标
用最小 Dart CLI 验证:
- synchronous code / microtask / event queue 的执行顺序
Future(() {})与Future.microtask的差别Isolate.run把 CPU 密集任务挪到独立 isolate- 为什么 Future 不是线程,isolate 才是真正的并发隔离单元
2. 工程要点
- 使用纯 Dart
bin/入口,不依赖 Flutter UI - 一次运行同时打印 event loop 顺序与 isolate 计算结果
- 保留简单素数统计任务,便于观察 CPU 工作被移到 isolate
3. 关键实现速览
先看最小关键片段,再决定是否进入完整源码页。
3.1 event loop + await 恢复
为什么看这段:它一次性展示了同步代码、microtask、event queue、await 恢复点的最小顺序关系。
dart
print('1. sync start');
scheduleMicrotask(() => print('2. microtask via scheduleMicrotask'));
Future.microtask(() => print('3. microtask via Future.microtask'));
Future(() => print('5. event queue future'));
final chained = Future(() {
print('4. future body before await continuation');
return 'future-result';
});
final futureResult = await chained;
print('6. await resumed with $futureResult');极简伪代码:
text
先执行同步代码
→ 清空 microtask 队列
→ 执行 event queue 里的 Future
→ await 等待 Future 完成后再恢复后半段完整源码:
3.2 Isolate:把 CPU 计算移出主 isolate
为什么看这段:它是“Future 不是线程,真正并发隔离单元是 isolate”的最短证据。
dart
final isolateResult = await Isolate.run(() => _countPrimesUnder(20000));
print('7. isolate result: $isolateResult primes below 20000');极简伪代码:
text
主 isolate 发起一个 CPU 计算任务
→ Isolate.run 在独立 isolate 执行
→ 结果返回主 isolate
→ 主 isolate 继续后续打印完整源码:
4. 运行方式
bash
cd labs/dart/host
dart run bin/runtime_concurrency/event_loop_isolate_demo.dart5. 预期现象
- 同步打印先执行
microtask先于 event queue 的Future(() {})await之后的后半段在对应 future 完成后继续- isolate 任务最终返回计算结果,但它并不共享主 isolate 内存
6. 常见误区
| 误区 | 实际情况 |
|---|---|
| Future 就是开线程 | 不是,Future 默认仍在当前 isolate 的事件循环中调度 |
microtask 和普通 Future 差不多 | 不一样,microtask 会优先清空 |
| isolate 只是更快的 Future | 不是,isolate 是独立内存与消息传递模型 |