Isolate microTask event Isolate.spawn() compute

news/2024/7/7 19:34:50

我们的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


http://lihuaxi.xjx100.cn/news/1027324.html

相关文章

把多列的迭代次数问题化简为单列问题

前已有实验表明,当训练集只有一列的时候,收敛迭代次数与训练集分布的标准差成反比。分布越均匀迭代次数越大。如果可以把多列问题化简为单列问题,比较迭代次数的大小顺序就会变得很简单。 ( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 做一个网络来…

今年又是一年自媒体高峰期你是否抓住了

影视剪辑容易遇到哪些问题: 1、视频格式格式不对,剪辑软件不支持; 2、视频封面不会做; 3、PR导出视频时,没办法做其他事,效率不高; 4、自己配音不好听,配音软件又不好找&#xf…

合创视觉科技平面设计师的职业路线

平面设计师很有必要在一个时期中找到自己的目标,为自己规划一条适合自己的职业规划   确定志向   设定职业生涯目标   制定行动计划与措施   求知欲、设计习惯与坚持   平面设计是一个创意工作,它包含海报、书籍画册、LOGO等设计&am…

React 的源码与原理解读(六):reconcileChildren 与 DIFF 算法

写在专栏开头(叠甲) 作者并不是前端技术专家,也只是一名喜欢学习新东西的前端技术小白,想要学习源码只是为了应付急转直下的前端行情和找工作的需要,这篇专栏是作者学习的过程中自己的思考和体会,也有很多参…

adb环境变量配置

adb环境变量配置Android一. 简介二. 环境变量配置1.JDK安装2.SDK安装3. 资源共享4. 配置环境变量4.1 方式一:4.2 方式二:5. adb常用命令的使用6. 结果Android List of ADB Commands and Fastboot Commands for Android 如果你是一个android用户&#xf…

单片机addr2line的使用说明

1,单片机程序挂死了,无法用jlink调试时,我们一般怎么定位呢,我们一般借助外来工具addr2line工具来调式。 当程序挂死时,我们首先编译时选择c99, 编译后烧写相应的bin文件/csf文件到单片机,烧写后 发现程序挂死&#x…

AutoHotkey1的录制器Pulover‘s Macro Creator

1、前置 使用录制器之前先使用AutoHotkey:AutoHotkey的helloworld 2、下载Pulover’s Macro Creator 访问sourceforge或者Github下载 安装时不要选择语言,安装完成使用时会自动使用中文显示界面。 ‼注意安装捆绑,卸载webcompanion‼ 3、…

python脚本与shell脚本的相互调用

python脚本与shell脚本的相互调用 python脚本调用shell脚本: 存在的shell脚本(test_sh.sh): #!/bin/cshfind . -name 2.txt在python脚本中调用test_sh.sh脚本 import os os.system(./test_sh.sh)当需要传参数到shell脚本中时 …