我们的flutter应用启动的时候就会开辟一个独立的ioslate,这里面包含了一个独立的内存空间和一个携带 event loops的单一线程和 microTask queue(微任务队列),这个单一线程只处理事件循环。

使用Isolate.spawn()Flutter's compute()函数新建独立的ioslate执行大数据量的计算

不同ioslate之间可以使用ReceivePort相互访问,他们之间唯一的工作方式就是通过不停的消息传递将事件传递给对方,在将事件加入到自己的事件队列中。

_NativeSocket封装了一个操作系统的socket,os是操作系统的意思,也就是说调用socket.nativeCreateUnixDomainConnect方法的时候会到调用操作系统的socket,也就是说网络请求其实是操作系统完成的,这就是为什么flutter应用是单线程模型的应用,但是在默认的isolate做网络请求却不会卡 UI 的原因,因为网络请求就不是dart层完成的,是操作系统完成的

作者:brock
链接:https://www.jianshu.com/p/ac48301db174

Dart 2.15 里新增了 isolate groups 的概念,isolate groups 中的 isolate 共享程序里的各种内部数据结构,也就是虽然 isolate groups 还是不允许 isolate 之间共享可变对象,但 groups 可以通过共享堆来实现结构共享,如:Dart 2.15 后可以将对象直接从一个 isolate 传递到另一 isolate,而在此之前只支持基础数据类型。

在 Flutter 3.7 之前,我们只能从 root isolate 去调用 Platform Channels ,如果你尝试从其他 isolate 去调用 Platform Channels ,就会收获这样的错误警告

在 Flutter 3.7 之前,Platform Channels 是和 _DefaultBinaryMessenger 这个全局对象进行通信,但是一但切换了 isolate ,它就会变为 null ,因为 isolate 之间不共享内存

而从 Flutter 3.7 开始,简单地说,Flutter 会通过新增的 BinaryMessenger 来实现非 root isolate 也可以和 Platform Channels 直接通信,例如:我们可以在全新的 isolate 里,通过 Platform Channels 获取到平台上的原始图片后,在这个独立的 isolate 进行一些数据处理,然后再把数据返回给 root isolate ,这样数据处理逻辑既可以实现跨平台通用,又不会卡顿 root isolate 的运行。

将 Future.wait 的 await 修改为 .then 去执行,如果这时候你再调用 spawn 和 compute ,你就会发现 spawn 下代码依然可以正常执行,但是 compute 却不再正常执行

compute 不就是 Flutter 针对 Isolate.spawn 的简易封装吗?

其实原因就在这个封装上,compute 现在不是直接执行 Isolate.spawn 代码,而是执行 Isolate.run ,而 Isolate.run 针对 Isolate.spawn 做了一些特殊封装。

compute 内部会将执行对象封装成 _RemoteRunner 再交给 Isolate.spawn 执行,而 _RemoteRunner 在执行时,会在最后强制调用 Isolate.exit ,这就会导致前面的 Future.wait 还没执行,而 Isolate 就退出了,从而导致代码无效的原因。

Flutter 小技巧之 3.7 性能优化background isolate - 知乎

简单示例:

import ‘package:flutter/services.dart’;
import ‘package:shared_preferences/shared_preferences.dart’;void main() {// Identify the root isolate to pass to the background isolate.// (API introduced in Flutter 3.7)RootIsolateToken rootIsolateToken = RootIsolateToken.instance!;Isolate.spawn(_isolateMain, rootIsolateToken);
}void _isolateMain(RootIsolateToken rootIsolateToken) async {// Register the background isolate with the root isolate.BackgroundIsolateBinaryMessenger.ensureInitialized(rootIsolateToken);// You can now use the shared_preferences plugin.SharedPreferences sharedPreferences =await SharedPreferences.getInstance();print(sharedPreferences.getBool(‘isDebug’));
}

https://medium.com/flutter/introducing-background-isolate-channels-7a299609cad8

Isolate microTask event Isolate.spawn() compute相关推荐

  1. flutter中compute和isolate

    async和await: 对于普通的任务,使用async和await可实现异步处理任务,而async的处理方式并非使用的是多线程,而是依然在UI线程中处理任务,是在同一个线程上的并发操作. 对于比较繁 ...

  2. Flutter 异步编程:Future、Isolate 和事件循环

    原文地址:Futures - Isolates - Event Loop 原文作者:www.didierboelens.com 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/g ...

  3. Dart 异步编程之 Isolate 和事件循环

    尽管 Dart 是个单线程任务,但它提供 Future.Stream.后台任务以及其他特性用于编写现代异步程序以及响应式程序(Flutter).本文讲的是 Dart 后台任务的基础:Isolate 和 ...

  4. dart调用python_Dart - Isolate 并发

    在Dart中实现并发可以用Isolate,它是类似于线程(thread)但不共享内存的独立运行的worker,是一个独立的Dart程序执行环境.其实默认环境就是一个main isolate. 在Dar ...

  5. Dart - Isolate 并发

    在Dart中实现并发可以用Isolate,它是类似于线程(thread)但不共享内存的独立运行的worker,是一个独立的Dart程序执行环境.其实默认环境就是一个main isolate. 在Dar ...

  6. 【Flutter 异步编程 - 捌】 | 计算耗时? Isolate 来帮忙

    一.问题引入 - 计算密集型任务 假如现在有个需求,我想要计算 1 亿 个 1~10000 间随机数的平均值,在界面上显示结果,该怎么办? 可能有小伙伴踊跃发言:这还不简单,生成 1 亿 个随机数,算 ...

  7. Flutter 小技巧之 3.7 性能优化background isolate

    Flutter 3.7 的 background isolate 绝对是一大惊喜,尽管它在 release note 里被一笔带过 ,但是某种程度上它可以说是 3.7 里最实用的存在:因为使用简单,提 ...

  8. Maple_公式推导(subs,isolate)

    matlab的符号计算内核采用Maple. 使用maple进行公式推导的好处(出自https://blog.csdn.net/qq_45330313/article/details/104511285 ...

  9. 【Flutter入门到进阶】Dart进阶篇---多线程异步Isolate

    1 Isolate 1.1 什么是Isolate 1.1.1 概念 线程?异步?隔离?到底什么意思?         Isolate中文意思是隔离,从使用角度来说是Dart的线程,但是从本质虚拟机的实 ...

最新文章

  1. Linux防火墙限制指定端口只能由指定IP访问
  2. 让你的eclipse插件只下载一次
  3. Java实现提现到微信的功能
  4. 中国最神秘的一所大学,它只存在过8年,却成了永远的第一
  5. Hbase 的javaAPI基本操作用 在idea上的实现
  6. ESP32 分区介绍
  7. 让引擎不再是你的唯一,对百度再见
  8. linux环境OpenRASP使用教程,集成openRASP与攻击测试
  9. 11月 北京 | 高性能之GPU CUDA 3天密集式进阶课程
  10. 谜题39:您好,再见!
  11. D. Magic Gems(矩阵快速幂 || 无敌杜教)
  12. mysql中innodb存储引擎在numa系统上的优化_MySQL中InnoDB存储引擎在NUMA系统上的优化...
  13. python rest 框架,[Python自学] restframework
  14. 编译SONiC交换机镜像(转,参考2)
  15. MFRC50001T
  16. 滴水石穿,奇迹是一点点实现的
  17. 大数据学习之环境构建
  18. 简单三步实现给公众号添加附件
  19. protege的下载
  20. 通过Keras + LSTM训练天气污染程度预测模型

热门文章

  1. OpenSea钓鱼攻击事件得到的启发警惕
  2. 键盘return键的设置
  3. 将来我一定将他(科比)讲给你听!特别是你在遇到坎坷,感到迷茫的时候!
  4. WPF TreeView 启动时如何默认选择首个节点
  5. Windows快捷键笔记
  6. 找不到php软件包无法卸载,为什么有些软件卸载不了怎么办
  7. C语言之流水线作业问题
  8. 投资时如何更好地「抄作业」?
  9. 王慧文复出进军人工智能,王兴投资BlockCity区块城市搞元宇宙
  10. 【QML】Attached Properties 附加属性