Dart 多线程:Isolate

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 的操作做访问控制。

songfei 支付宝支付宝
songfei 微信微信
0%