Isolate microTask event Isolate.spawn() compute
我们的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相关推荐
- flutter中compute和isolate
async和await: 对于普通的任务,使用async和await可实现异步处理任务,而async的处理方式并非使用的是多线程,而是依然在UI线程中处理任务,是在同一个线程上的并发操作. 对于比较繁 ...
- Flutter 异步编程:Future、Isolate 和事件循环
原文地址:Futures - Isolates - Event Loop 原文作者:www.didierboelens.com 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/g ...
- Dart 异步编程之 Isolate 和事件循环
尽管 Dart 是个单线程任务,但它提供 Future.Stream.后台任务以及其他特性用于编写现代异步程序以及响应式程序(Flutter).本文讲的是 Dart 后台任务的基础:Isolate 和 ...
- dart调用python_Dart - Isolate 并发
在Dart中实现并发可以用Isolate,它是类似于线程(thread)但不共享内存的独立运行的worker,是一个独立的Dart程序执行环境.其实默认环境就是一个main isolate. 在Dar ...
- Dart - Isolate 并发
在Dart中实现并发可以用Isolate,它是类似于线程(thread)但不共享内存的独立运行的worker,是一个独立的Dart程序执行环境.其实默认环境就是一个main isolate. 在Dar ...
- 【Flutter 异步编程 - 捌】 | 计算耗时? Isolate 来帮忙
一.问题引入 - 计算密集型任务 假如现在有个需求,我想要计算 1 亿 个 1~10000 间随机数的平均值,在界面上显示结果,该怎么办? 可能有小伙伴踊跃发言:这还不简单,生成 1 亿 个随机数,算 ...
- Flutter 小技巧之 3.7 性能优化background isolate
Flutter 3.7 的 background isolate 绝对是一大惊喜,尽管它在 release note 里被一笔带过 ,但是某种程度上它可以说是 3.7 里最实用的存在:因为使用简单,提 ...
- Maple_公式推导(subs,isolate)
matlab的符号计算内核采用Maple. 使用maple进行公式推导的好处(出自https://blog.csdn.net/qq_45330313/article/details/104511285 ...
- 【Flutter入门到进阶】Dart进阶篇---多线程异步Isolate
1 Isolate 1.1 什么是Isolate 1.1.1 概念 线程?异步?隔离?到底什么意思? Isolate中文意思是隔离,从使用角度来说是Dart的线程,但是从本质虚拟机的实 ...
最新文章
- Linux防火墙限制指定端口只能由指定IP访问
- 让你的eclipse插件只下载一次
- Java实现提现到微信的功能
- 中国最神秘的一所大学,它只存在过8年,却成了永远的第一
- Hbase 的javaAPI基本操作用 在idea上的实现
- ESP32 分区介绍
- 让引擎不再是你的唯一,对百度再见
- linux环境OpenRASP使用教程,集成openRASP与攻击测试
- 11月 北京 | 高性能之GPU CUDA 3天密集式进阶课程
- 谜题39:您好,再见!
- D. Magic Gems(矩阵快速幂 || 无敌杜教)
- mysql中innodb存储引擎在numa系统上的优化_MySQL中InnoDB存储引擎在NUMA系统上的优化...
- python rest 框架,[Python自学] restframework
- 编译SONiC交换机镜像(转,参考2)
- MFRC50001T
- 滴水石穿,奇迹是一点点实现的
- 大数据学习之环境构建
- 简单三步实现给公众号添加附件
- protege的下载
- 通过Keras + LSTM训练天气污染程度预测模型