Skip to content

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.dart

5. 预期现象

  • 同步打印先执行
  • microtask 先于 event queue 的 Future(() {})
  • await 之后的后半段在对应 future 完成后继续
  • isolate 任务最终返回计算结果,但它并不共享主 isolate 内存

6. 常见误区

误区实际情况
Future 就是开线程不是,Future 默认仍在当前 isolate 的事件循环中调度
microtask 和普通 Future 差不多不一样,microtask 会优先清空
isolate 只是更快的 Future不是,isolate 是独立内存与消息传递模型

7. 对应知识库文档

8. 关键源码