原文链接:https://juejin.cn/post/7041026188101287944
Dart SDK 的 2.15 版本新增了具备有更快并发能力的 isolates 、支持 tear-off 的构造函数 、关于 dart:core 库枚举支持的改进、包发布者相关的新功能等等。
isolates 的并发
如今的物理设备几乎都有多核的 CPU ,能够并行地执行多个任务,而对于大多数 Dart 程序而言,这些内核的使用过程对开发人员来说是透明的:
默认情况下 Dart 运行时所有 Dart 代码只会在单个内核上运行,但会使用其他内核来执行系统级任务,例如:异步的输入/输出、读写文件或者网络调用等。
但有时候 Dart 代码本身可能需要用到并发执行的场景,例如可能同时有“连续的动画和一个需要长时间运行的任务”,或者解析一个大型 JSON 文件等等场景。
如果附加需要执行的任务花费时间太长,可能就会导致 UI 卡顿或运行滞后,所以通过将这些额外的任务移动到另外一个单独的核心运行,保证动画可以继续在主执行线程上运行而不受干扰是必要的支持。
Dart 的并发模型是基于isolates设计的——一种相互隔离的独立执行单元。这是为了防止在共享内存时,出现相关的并发编程错误问题,例如data races.等。
Dart 通过不允许在 isolates 之间共享任何可变对象来防止这些错误,而是使用 消息传递 在 isolates 之间交换状态,而如今在 Dart 2.15 中对 isolates 进行了许多实质性的改进。
Dart 2.15 重新设计和实现了 isolates 的工作方式,引入了一个新概念:isolate groups, isolate groups 中的 isolate 共享正在运行的程序中的各种内部数据结构,这使得 groups 中的个体 isolates 变得更加轻便。**
如今在 isolate groups 中启动额外的 isolate 可以快近 100 倍,因为现在不需要初始化程序结构,并且产生新的 isolate 所需要的内存减少了 10-100 倍。
虽然 isolate groups 还是不允许 isolate 之间共享可变对象,但该 group 可以通过共享堆来实现的,所以能够解锁更多功能,比如可以将对象从一个 isolate 传递到另一 isolate,这样就可以用于执行需要返回大量内存数据的任务。
例如通过网络调用获取数据,将该数据解析为一个大型 JSON 对象,然后将该 JSON 对象返回到主isolates。 在 Dart 2.15 之前执行该操作需要“深度复制”,如果复制花费的时间超过帧预算时间,就可能会导致 UI 卡顿。
在 2.15 中工作的 isolates 可以调用 Isolate.exit()
将其结果作为参数传递。将运行的 isolates 结果的内存传递给主 isolates ,而不是进行复制,主 isolates 可以在指定时间内接收结果。
这个行为在更新的Flutter 2.8 中 的 compute() 函数里,同样