Dart 被设计成为单线程、异步的语言。 尤其在 Flutter 当中,大部分的 Dart 代码都执行在一个线程,应该叫一个 Isolate 里面。
单线程带来了很多好处,不用考虑数据被同时访问,不用加锁,也就有没有了死锁;也给内存的垃圾回收带来了方便。
Isolate 对象
-
Isolate 代表了 Dart 执行的上下文,所有的 Dart 代码都运行在其中。
-
Dart 代码只能访问到当前 Isolate 的类和变量,不同 Isolate 之间内存是隔离的,只能通过 Ports 进行通讯。
-
每一个 Isolate 都有独立的消息循环和垃圾回收。
-
Isolate 可以被其他的 Isolate 控制,比如暂停,终止等。 这些操作都比较危险,可以做访问控制。
-
Isolate 对象不能在多个 Isolate 之间进行传递,但是 SendPort 对象和 Capability 对象可以传递。
Port 对象 (ReceivePort, RawRecivePort, SendPort)
-
Port 是多个 Isolate 之间通讯的管道,是单向的。
-
ReceivePort 和 SendPort 是成对使用的,SendPort 是由 ReceivePort 创建的,通过 ReceivePort 对象或 RawRecivePort 对象的 sendPort 成员获取。
-
ReceivePort 是一个 Stream, 可以直接监听。
-
RawReceivePort 比较底层,需要设置处理函数 handler 来接收消息; handler 的调用没有 Zone 的概念,所以永远在 Zone.root 里面。
Capability 对象
-
Capability 对象是可以在多个 Isolate 之间传递的对象,因为内存是隔离的,理论上不同的 Isolate 里面是不可能有相同对象的,Capablility 对象是专门实现的一种特殊对象,在不同 Isolate 传递时,还能保持相等。
-
Capability 对象可以作为凭据在 Isolate 间对 Isolate 的操作做访问控制。