我们的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. 10w行级别数据的Excel导入优化记录
  2. 谷歌如何利用人工智能重塑美国医疗行业?
  3. ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
  4. 群晖docker装huginn_应用篇:Docker版Zerotier实现内网穿透
  5. odis工程师使用方法_傅里叶红外光谱仪常见故障维修及排除方法,你了解有多少种呢?...
  6. python判断进程是否存在
  7. 《精通LabVIEW虚拟仪器程序设计与案例实现》一2.6 VI的创建与编辑
  8. python pip 快速安装第三方库和下载好whl文件
  9. PyQt5 实现类似海康的设备搜索工具
  10. 关于宇宙宿命论的一些思考
  11. 数据分析新人如何面对繁杂且突然的数据需求
  12. WiFi认证—分析从连接WiFi到上网的全过程(一)
  13. 本地Ping不通华为云服务问题解决
  14. 163vip邮箱账号登录入口在哪儿?163邮箱登录不了怎么办?
  15. HTML元素 span,div,p,h,a盒子模型中padding属性的演示和理解
  16. 判断电脑是否安装WPS
  17. this.dom.getContext is not a function;
  18. JavaScript内存分配及垃圾回收机制
  19. n个元素进栈,共有多少种出栈顺序?
  20. DIV布局——化妆品商城-功能齐全(43页) HTML+CSS+JavaScript web大作业 静态网页

热门文章

  1. Apache NiFi系统管理员指南 [ 一 ]
  2. 谷歌三大核心技术(一)The Google File System中文版
  3. xp计算机如何查看内存大小,怎样查看电脑内存大小_xp怎么看电脑内存大小
  4. 彪哥情人节期间征女友一名铃声 彪哥情人节期间征女友一名手机...
  5. python输出宽度是什么意思_Python输出长度
  6. 洛谷P2036 PERKET
  7. docker--扩展学习-网络--原理--16
  8. 麻省理工学院研发可编程数字纤维
  9. HDU2567:寻梦
  10. 如何根据一个值来动态让select下的option选中