百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Flutter——isolate flutter isolate

liuian 2024-12-26 15:05 65 浏览

所有Dart代码都在isolates中运行,isolate与线程类似,但不同之处在于isolate具有自己的内存。它们不以任何方式共享状态,只能通过消息传递进行通信。默认情况下,Flutter应用程序在一个单独的isolate上完成所有的工作——main isolate。在大多数情况下,该模型允许更简单的编程,并且足够快,应用程序的UI不会变得无响应。

但是,有时应用程序需要执行非常大的计算,这可能会导致“UI抖动”(不稳定的运动)。如果您的应用程序因为这个原因而出现故障,您可以将这些计算转移到其他isolate中。这允许底层运行时环境与主UI isolate的工作并发地运行计算,并利用多核设备。

每个isolate都有自己的内存和自己的事件循环。事件循环按照事件添加到事件队列的顺序处理事件。在main isolate上,这些事件可以是任何事情,从处理用户在UI中的点击,到执行一个函数,再到在屏幕上绘制一个框架。下图显示了一个示例事件队列,其中有3个事件等待处理。

为了平滑渲染,Flutter每秒向事件队列中添加60次“绘制帧”事件(对于60Hz的设备)。如果这些事件没有及时处理,应用程序就会遇到UI阻塞,或者更糟,完全没有响应。

每当一个进程无法在帧间隙(即两帧之间的时间)内完成时,最好将工作放给另一个isolate,以确保main isolate能够每秒生成60帧。在Dart中生成isolate时,它可以与main isolate并发地处理该工作,而不会阻塞它。

isolate的使用场景

使用isolate时,只有一个硬性规则,那就是当大型计算导致你的Flutter应用程序出现UI阻塞时。当有任何计算需要比Flutter的帧间隙更长的时间时,就会出现这种情况。

任何流程都可能需要更长的时间才能完成,这取决于实现和输入数据,因此不可能创建一个完整的列表,说明何时需要考虑使用隔离。也就是说,isolate通常用于以下方面:

1. 从本地数据库读取数据
2. 发送推送通知
3. 解析和解码大数据文件
4. 处理或压缩照片、音频文件和视频文件
5. 转换音频和视频文件
6. 在使用FFI时需要异步支持
7. 对复杂的列表或文件系统应用过滤

isolate间消息传递

Dart的isolate是Actor模型的实现。它们只能通过消息传递相互通信,这是通过Port对象完成的。当消息在彼此之间“传递”时,它们通常从发送isolate复制到接收isolate。这意味着传递给isolate的任何值,即使在该isolate上发生了突变,也不会改变原始isolate上的值。

传递给isolate时唯一不被复制的对象是无论如何都无法更改的不可变对象,例如String或不可修改的byte。当在isolate之间传递不可变对象时,将通过端口发送对该对象的引用,而不是复制对象,以获得更好的性能。因为不可变对象不能更新,所以这有效地保留了参与者模型的行为。

此规则的一个例外是,当isolate在使用isolate发送消息时调用Isolate.exit方法。由于发送隔离在发送消息后将不存在,因此它可以将消息的所有权从一个isolate传递给另一个isolate,从而确保只有一个isolate可以访问消息。

SendPort.send 是复制一份消息发送;Isolate.exit是发送消息的引用;

创建isolate

在Flutter中将进程移动到isolate的最简单方法是使用isolate .run方法。此方法生成一个isolate,向生成的isolate传递一个回调以启动某些计算,从计算返回一个值,然后在计算完成时关闭isolate。这一切都与main isolate并发发生,并且不会阻塞它。

例如,考虑以下代码,它从文件加载一个大的JSON blob,并将该JSON转换为自定义Dart对象。如果json解码过程没有放到一个新的isolate执行,这个方法将导致UI在几秒钟内变得无响应。

// Produces a list of 211,640 photo objects.
// (The JSON file is ~20MB.)
Future<List<Photo>> getPhotos() async {
  final String jsonString = await rootBundle.loadString('assets/photos.json');
  final List<Photo> photos = await Isolate.run<List<Photo>>(() {
    final List<Object?> photoData = jsonDecode(jsonString) as List<Object?>;
    return photoData.cast<Map<String, Object?>>().map(Photo.fromJson).toList();
  });
  return photos;
}

以上是介绍了创建一个短暂生命的isolate,会在执行完就关闭该isolate。短期isolate使用起来很方便,但是产生新的isolate和将对象从一个隔离复制到另一个隔离时需要性能开销。如果您重复使用Isolate.run进行相同的计算,那么通过创建不会立即退出的隔离可能会获得更好的性能。

当您的特定进程需要在应用程序的整个生命周期中重复运行,或者您的进程在一段时间内运行并且需要向main isolate产生多个返回值时,那么就需要长期存在的isolate。

长期存在的isolate

  1. 使用Isolate.spawn()创建。
  2. 使用Isolate.exit()退出。
  3. ReceivePortSendPort是isolate之间相互通信的唯一途径。

端口通讯跟之前介绍的Streams类似。StreamController Sink在一个isolate中创建,listeners设置在另一个isolate中。按这个逻辑来看的话,StreamConroller可以理解为SendPort使用"add"方法添加消息就相当于send()ReceivePort就相当于listeners,当这些listeners收到一个新的消息,就调用回调方法。

Web平台

Dart web平台(包括Flutter web)不支持isolate。如果你的Flutter应用的目标是web,你可以使用计算方法来确保你的代码可以编译。compute()方法在web上的主线程上运行计算,但在移动设备上生成一个新线程。在移动和桌面平台上,await compute(fun, message)相当于await Isolate.run(() => fun(message))。

小节

所有UI任务和Flutter本身都耦合到main isolate。因此,你不能在生成的isolate中使用rootBundle访问资源,也不能在生成的isolate中执行任何widget或UI工作。

相关推荐

好看电脑桌面壁纸高清(好看电脑桌面壁纸高清搞怪)

首先,在桌面点击右键,然后进入属性,然后进入显示,然后上面写着屏幕分辨率,再按照分辨率下载壁纸  以下为调整电脑桌面清晰度步骤:  1,启动电脑,来到桌面,在空白处,单击鼠标右键,去打开桌面右键菜单...

iso国际标准(ISO国际标准键盘)

6000iso流明相当于7500ansi流明。6000÷0.8等于7500ansi流明ANSI流明是美国的亮度标准,ISO流明是国际标准,目前普遍将ANSI流明和ISO流明按照1:0.8的比例换算,即...

win7家庭高级版和专业版(win7系统家庭高级版)

①如果你是自己用,不是在公司用,一般是用不出什么区别的,兼容性和性能上毫无区别,只是功能上有所取舍;②两者在高级安全性和商业部署上有所区别,专业版比家庭版多了Bitlocker(磁盘加密技术)、组策略...

win11怎么样(win11怎么样删除软件)

win11适合打游戏的。主要原因如下:1、win11的升级并不会丢失原本系统中的文件和软件,因此用户可以在升级后直接玩原本的游戏。2、win11虽然是一款新系统,但是在游戏性能的表现上已经有着非常好的...

adobe flash官方下载(adobe flash player完整版下载)

您可以从Adobe官网(https://get.adobe.com/flashplayer/)下载AdobeFlashPlayer最新版本,并在您的手机上安装它。Adobe宣布终止研发移动设备fl...

五笔打字字根表(金山五笔打字字根表)
五笔打字字根表(金山五笔打字字根表)

1区横起笔、G键:王旁青头兼五一;F键:土士二干十寸雨;D键:大三肆头古石厂;S键:木丁西边要无女;A键:工戈草头右框七。2区竖起笔、H键:目止具头卜虎皮;J键:日曰两竖与虫依;K键:口中两川三个竖;L键:田框四车甲单底;M键:山由贝骨下...

2025-11-10 21:55 liuian

u盘写保护打开方法(u盘写保护打不开怎么把它格式化)

1.查看U盘上是否有写保护开关,打开开关(通常写保护开关在U盘的侧面是一个滑块)。2.尝试重新插入U盘读取数据。解决方案二:运行磁盘检测修复命令1.使用组合键“Win+R”,唤出运行页,在对话框中...

微软密钥在哪里找(bitlocker万能恢复密钥)

如果您使用的是MicrosoftOffice365,密钥激活的账户是免费订阅的,因此不需要查看。您可以通过以下步骤免费获取Office365:1.访问Microsoft官网(https...

大学生一般买什么笔记本电脑

回答:联想小新Air15锐龙版性能轻薄本15.6英寸全面屏轻薄笔定位:轻薄本配置:处理器(R7-5700U)、显卡(集显)、分辨率(1920×1080)、内存(16G)、尺寸(15.6英寸)评价:20...

樱花影院电视剧电影免费观看

像科学佳萌一样剧情的漫画有《某科学的超电磁炮》。《某科学的超电磁炮》讲述的是有230万人口,其中八成人口为学生的“学园都市”,是比其他地区科技更为先进,并从事“超能力开发”的特殊地区。而整座学园都市中...

ghost软件的功能(ghost软件类型)

Ghost软件的功能就是把分区或者是硬盘做成镜像,或者是把镜像文件恢复到分区或者是恢复到硬盘。完整的功能就是把某一个分区备份成一个镜像文件,或者是把整个硬盘备份成一个镜像文件。在需要的时候可以把这个镜...

360一键还原系统(360一键还原系统怎么关闭)

360安全卫士中选择功能大全,系统工具,系统重装,即可完成操作。1、首先,在电脑上打开360安全卫士的软件,在打开的主界面点击术马查杀。2、然后,在术马查杀的界面点击左下方恢复区的图标。...

mac安装虚拟机(mac安装虚拟机可以用网银吗)

可以安装,步骤如下第一步:首先在Mac中下载VirtualBox工具,然后安装(下载地址看图或去网上搜索Mac版VirtualBox虚拟机工具)。  第二步:下载完成后,打开VirtualBox,点击...

笔记本键盘(笔记本键盘个别键失灵怎么修复)

键盘分功能键区和字母数字符号键区。功能键区环绕在键盘周边,可以单键使用(如F1),也可以组合键使用。主要用于控制电脑部分功能(如触摸板)的开关、撤销(Esc)、帮助(如F1)、执行操作(Enter)、...

tplogin cn登录管理界面(tplogincn登录入口管理员密码)

TP-LINK路由器的登录入口(管理页面)地址是tplogin.cn,我们只需打开浏览器,在浏览器顶部的地址栏里输入路由器的管理页面地址tplogin.cn就能打开tplink登录入口页面了。tplo...