首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Flutter Isolate入门指南:轻松实现高效并发编程

  • 25-02-17 10:00
  • 2142
  • 5887
blog.csdn.net

目录

一、Flutter Isolate简介

二、Flutter Isolate的本质

三、Flutter Isolate的使用场景

四、如何在Flutter中使用Isolate

4.1 创建Isolate

4.2 与Isolate通信

4.3 主Isolate与其他Isolate互相通信

五、Isoate 小结

六、Event Loop

6.1 Event Loop 的核心结构

6.2 Event Loop 的工作流程

6.3 Event Loop 小结

相关推荐


一、Flutter Isolate简介

        Flutter Isolate是Dart语言在Flutter框架中的并发编程机制,解决主线程(UI 线程)的阻塞问题。每个Isolate都拥有独立的内存堆、执行线程和事件循环,确保任务执行的独立性和安全性。与传统线程不同,Isolate之间不共享内存,避免了数据竞争问题,简化了并发编程的复杂性。

特性Isolate传统线程
内存共享❌ 独立内存✅ 共享内存(需同步机制)
通信方式消息传递(SendPort/ReceivePort)共享变量 + 锁
安全性高(无数据竞争)低(需处理竞态条件)
适用场景CPU 密集型任务、IO 阻塞操作轻量级并发任务

二、Flutter Isolate的本质

  • 独立内存空间:每个 Isolate 拥有独立的内存堆(Heap),不共享任何状态,避免了多线程的锁竞争和共享数据冲突问题。

  • 事件循环:每个 Isolate 运行在自己的线程上,拥有独立的 Dart 事件循环(Event Loop),用于处理异步任务(如 Future、Stream)。

  • 通信方式:Isolate 之间通过消息传递(Message Passing) 通信,数据通过序列化/反序列化传输。

三、Flutter Isolate的使用场景

  • 执行CPU密集型任务:如图像处理、音频处理(如压缩、滤镜)等耗时操作,可以放在Isolate中执行,避免阻塞主线程。
  • 处理大量数据:从网络获取大型数据集或进行大量的数据计算时(如 JSON/CSV 解析),使用Isolate可以提高应用的响应性。
  • 复杂算法计算(如加密、机器学习推理)

  • 网络请求阻塞操作(如大量并行的 HTTP 请求)

四、如何在Flutter中使用Isolate

4.1 创建Isolate

        使用Isolate.spawn()函数或compute()方法可以轻松创建新的Isolate。compute()方法是一个更高层次的封装,它简化了Isolate的创建和消息传递过程,通常用于简单的并发计算任务。

  1. import 'dart:isolate';
  2. var num ;
  3. void main(){
  4. print(num);//null,未初始化
  5. num = 10;
  6. print(num);//10
  7. Isolate.spawn(isolateNew, "1234");
  8. }
  9. void isolateNew(message) {
  10. print(num);//num仅在主isolate初始化,在此Isolate中num未初始化,因此输出为=>null
  11. print(message);
  12. }

4.2 与Isolate通信

        Isolate之间通过消息传递机制进行通信。使用ReceivePort和SendPort可以发送和接收消息。在创建Isolate时,需要将一个SendPort传递给Isolate,以便它可以将消息发送回主Isolate。

  1. import 'dart:isolate';
  2. var num ;
  3. void main(){
  4. num = 10;
  5. //创建一个消息接收器
  6. ReceivePort receivePort = ReceivePort();
  7. //创建isolate
  8. Isolate.spawn(isolateNew, receivePort.sendPort);
  9. //接收其他isolate发过来的消息
  10. receivePort.listen((massage){
  11. print(massage);//我来自 isolateNew
  12. });
  13. }
  14. void isolateNew(SendPort sendPort) {
  15. sendPort.send("我来自 isolateNew");
  16. }

        在这个例子中,我们创建了一个ReceivePort来接收来自Isolate的消息,并将SendPort传递给Isolate。Isolate完成操作后,通过SendPort将消息发送回主Isolate。 

  1. import 'dart:isolate';
  2. var num ;
  3. void main(){
  4. num = 10;
  5. //创建一个消息接收器
  6. ReceivePort receivePort = ReceivePort();
  7. //创建isolate
  8. Isolate.spawn(isolateNew, receivePort.sendPort);
  9. Isolate.spawn(isolateNew2, receivePort.sendPort);
  10. //接收其他isolate发过来的消息
  11. receivePort.listen((message){
  12. if("2"==message){
  13. print("我来自isolateNew2");//我来自 isolateNew
  14. }else{
  15. print(message);//我来自 isolateNew
  16. }
  17. });
  18. }
  19. void isolateNew(SendPort sendPort) {
  20. sendPort.send("我来自 isolateNew");
  21. }
  22. void isolateNew2(SendPort sendPort) {
  23. sendPort.send("2");
  24. }

         接收其他isolate发过来的消息,可以接收多个。你可以根据自身的需求来定义。

4.3 主Isolate与其他Isolate互相通信

  1. import 'dart:isolate';
  2. void main(){
  3. //创建一个消息接收器
  4. ReceivePort receivePort = ReceivePort();
  5. //创建isolate
  6. Isolate.spawn(isolateNew2, receivePort.sendPort);
  7. //接收其他isolate发过来的消息
  8. receivePort.listen((message){
  9. if(message is SendPort){
  10. print("我来自isolateNew2");//我来自 isolateNew2
  11. //从主 Isolate 发送消息给 isolateNew2
  12. message.send("我来自主Isolate");
  13. }else{
  14. print(message);//我来自 isolateNew
  15. }
  16. });
  17. }
  18. void isolateNew2(SendPort sendPort) {
  19. ReceivePort receivePortNew = ReceivePort();
  20. receivePortNew.listen((s){
  21. print("isolateNew2:$s");
  22. });
  23. sendPort.send(receivePortNew.sendPort);
  24. }

五、Isoate 小结

  • 通信成本:消息传递涉及数据拷贝(大型对象可能影响性能)。

  • 限制:Dart 的 Isolate 不支持共享内存(如需要共享状态,需借助第三方库如 flutter_isolate 或 Isolate Pool)。

  • 替代方案:对于轻量级任务,优先使用 Future 和 async/await(基于事件循环的并发)。

  • 避免频繁创建和销毁Isolate:Isolate的创建和销毁过程需要一定的时间和资源开销,因此应避免频繁创建和销毁Isolate。可以通过重用Isolate或创建Isolate池来优化性能。
  • 注意Isolate的生命周期管理:Isolate的生命周期由开发者自行管理,应确保在适当的时候销毁不再需要的Isolate,以避免资源泄露。
  1. receivePort.close();
  2. isolate.kill();

        Flutter Isolate为Flutter开发者提供了一种简单、高效、安全的并发编程机制。通过合理利用Isolate,我们可以轻松实现复杂业务逻辑的高效处理和数据的大量计算,为用户提供更加流畅和响应迅速的应用体验。

六、Event Loop

        同Android Handler类似,在Dart运行环境中也是靠事件驱动的,通过event loop不停的从队列中获取消息或者事件来驱动整个应用的运行,isolate发过来的消息就是通过loop处理。但是不同的是在Android中每个线程只有一个Looper所对应的MessageQueue,而Dart中有两个队列,一个叫做event queue(事件队列),另一个叫做microtask queue(微任务队列)。

6.1 Event Loop 的核心结构

        Event Loop 依赖两个关键队列管理任务:

队列类型描述
Microtask Queue(微任务队列)存放需要 立即执行 的轻量级任务(如 scheduleMicrotask 或 Future 的同步回调)。
Event Queue(事件队列)存放需要 按顺序执行 的异步任务(如 I/O、手势、绘制事件、Future 的异步回调)。

6.2 Event Loop 的工作流程

  1. 检查 Microtask Queue:
    每次事件循环迭代时,优先处理所有微任务,直到队列为空。

  2. 处理 Event Queue:
    从事件队列中取出 一个任务 执行(如处理用户点击、完成网络请求的回调)。

  3. 重复循环:
    重复上述过程,直到应用退出。

  1. import 'dart:isolate';
  2. void main(){
  3. //创建一个消息接收器
  4. ReceivePort receivePort = ReceivePort();
  5. //接收其他isolate发过来的消息
  6. receivePort.listen((message){
  7. print(message);
  8. });
  9. Future.microtask((){
  10. print("微服务任务1");
  11. });
  12. receivePort.sendPort.send("发送消息给ReceivePort AA");
  13. Future.microtask((){
  14. print("微服务任务2");
  15. });
  16. receivePort.sendPort.send("发送消息给ReceivePort BB");
  17. Future.microtask((){
  18. print("微服务任务3");
  19. });
  20. receivePort.sendPort.send("发送消息给ReceivePort CC");
  21. }

执行结果,微服务优先执行:

  1. 微服务任务1
  2. 微服务任务2
  3. 微服务任务3
  4. 发送消息给ReceivePort AA
  5. 发送消息给ReceivePort BB
  6. 发送消息给ReceivePort CC

6.3 Event Loop 小结

  • Event Loop 是 Dart 异步编程的基石,通过微任务队列和事件队列实现非阻塞任务调度。

  • 微任务优先于事件任务,适合执行轻量级、需立即完成的操作。

  • 保持主线程轻量:耗时操作应交给 Isolate,确保 Event Loop 能及时处理 UI 事件,保障流畅性。

相关推荐

Dart 中的Mixin:提高代码重用性和模块化的利器-CSDN博客文章浏览阅读1k次,点赞22次,收藏19次。本文介绍了Dart中Mixin的概念和使用方法。Mixin是一种代码重用机制,允许开发者将一些功能混入到一个类中,而不必通过继承来实现。文章详细阐述了Mixin的定义、使用以及与继承的冲突处理。通过使用Mixin,开发者可以大大提高代码的可重用性和模块化程度,将共通的功能封装起来,在需要的地方引入,避免了重复编写相同的代码。同时,Mixin还可以将复杂的代码逻辑拆分成更小的、可管理的模块,降低了代码的复杂性,提高了代码的可读性和可维护性。http://iyenn.com/rec/1651708.htmlhttp://iyenn.com/rec/1651708.htmlhttp://iyenn.com/rec/1651708.htmlFlutter 介绍及环境安装_flutter 安装-CSDN博客文章浏览阅读1.1k次,点赞2次,收藏3次。Flutter是Google开发的开源UI框架,用于跨平台移动应用开发,支持iOS、Android、Web等多个平台。其优势包括高性能、MaterialDesign和Cupertino风格组件、热重载以及跨平台能力。学习Flutter涉及Dart语言、基础概念、UI设计、状态管理、网络请求等方面,环境安装可参考Flutter中文网的教程。对于macOS开发,还需Xcode和CocoaPods。http://iyenn.com/rec/1690669.htmlhttp://iyenn.com/rec/1690669.htmlhttp://iyenn.com/rec/1690669.html

注:本文转载自blog.csdn.net的帅次的文章"https://shuaici.blog.csdn.net/article/details/145505453"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top