带你读《深入浅出Dart》十八、Dart的Isolate(1)

简介: 带你读《深入浅出Dart》十八、Dart的Isolate(1)

十八、Dart的Isolate

Isolate 是 Dart 中进行并发编程的一种方式。由于 Dart 是单线程模型,因此在需要处理 CPU 密集型任务或需要执行长时间运行的操作时,可以使用 Isolate。以下列出了一些常见的 Isolate 应用场景:

1.创建 Isolate

在 Dart 中,所有的代码都运行在一个单线程中,这个线程被称为主 Isolate。如果你需要执行耗时的计算,你可以创建一个新的 Isolate,然后在这个新的 Isolate 中执行你的计算。

 

import 'dart:isolate';
void printMessage(var message) {
  print('Message: $message');}
void main() async {
  var receivePort = ReceivePort();
  await Isolate.spawn(printMessage, 'Hello!', onExit: receivePort.sendPort);
  await for (var message in receivePort) {
    print('Received: $message');
  }}

 

在这个示例中,我们使用 Isolate.spawn 创建了一个新的 Isolate。我们传递了一个函数 printMessage 和一个消息 'Hello!' 给这个新的 Isolate。当这个新的 Isolate 完成后,它将使用 onExit 参数指定的 SendPort 发送一个消息。

 

需要注意的是,不同的 Isolate 之间不能共享内存,它们只能通过消息传递来进行通信。因此,你不能在一个 Isolate 中访问另一个 Isolate 的变量。

2.消息传递

在 Dart 中,Isolate 之间的消息传递是通过 SendPort 和 ReceivePort 来实现的。

SendPort和ReceivePort

SendPort 和 ReceivePort 是 Dart 中进行进程间通信的工具。你可以将 SendPort 看作是一个邮箱的地址,ReceivePort 看作是一个邮箱。你可以通过 SendPort 发送消息,然后在对应的 ReceivePort 中接收消息。

 

当你创建一个 ReceivePort 时,它将自动生成一个与之关联的 SendPort:

 

var receivePort = ReceivePort();
var sendPort = receivePort.sendPort;

 

你可以使用 sendPort.send 方法发送消息,然后在 receivePort 中监听消息:

 

sendPort.send('Hello!');
receivePort.listen((message) {
  print('Received: $message');});
  1. 在Isolate 之间传递消息

当你创建一个新的 Isolate 时,你可以将一个 SendPort 传递给这个新的 Isolate。然后你就可以通过这个 SendPort 向新的 Isolate 发送消息,或者从新的 Isolate 接收消息。

 

void printMessage(var message) {
  var sendPort = message[0] as SendPort;
  var message = message[1] as String;
  print('Message: $message');
  sendPort.send('Hello from new Isolate!');}
void main() async {
  var receivePort = ReceivePort();
  await Isolate.spawn(printMessage, [receivePort.sendPort, 'Hello!']);
  receivePort.listen((message) {
    print('Received: $message');
  });}

 

在这个示例中,我们向新的 Isolate 发送了一个列表。这个列表的第一个元素是一个 SendPort,第二个元素是一个字符串。在新的 Isolate 中,我们首先通过 SendPort 发送了一个消息,然后打印了接收到的字符串。在主 Isolate 中,我们监听了 ReceivePort,然后打印了接收到的消息。

 

需要注意的是,你只能通过 SendPort 发送一些简单的数据,例如数字、字符串、列表、映射等。你不能发送一个函数或者一个对象的实例。

 

带你读《深入浅出Dart》十八、Dart的Isolate(2)https://developer.aliyun.com/article/1348621?groupCode=tech_library

相关文章
|
前端开发 小程序
919. 【前端】Taro.useShareAppMessage 自定义分享封面
919. 【前端】Taro.useShareAppMessage 自定义分享封面
1412 2
|
关系型数据库 MySQL Java
Docker Compose详细教程(从入门到放弃)
Docker Compose详细教程(从入门到放弃)
2849 0
|
小程序 前端开发
2025商业版拓展校园圈子论坛网络的创新解决方案:校园跑腿小程序系统架构
校园跑腿小程序系统是一款创新解决方案,旨在满足校园配送需求并拓展校友网络。跑腿员可接单配送,用户能实时跟踪订单并评价服务。系统包含用户、客服、物流、跑腿员及订单模块,功能完善。此外,小程序增设信息咨询发布、校园社区建设和活动组织等功能,助力校友互动、经验分享及感情联络,构建紧密的校友网络。
466 1
2025商业版拓展校园圈子论坛网络的创新解决方案:校园跑腿小程序系统架构
|
传感器 数据采集 人工智能
MyEMS能源管理系统后台配置-门店管理
开源能源管理系统支持建筑、工厂等场景的电、水、气等能源数据采集与分析,提供报表、光伏、储能、充电桩、微电网、设备控制及AI优化等功能。本文介绍其车间管理配置,涵盖车间增删改查、绑定计量表、设备、数据点、传感器、工作日历及命令操作流程。
159 0
MyEMS能源管理系统后台配置-门店管理
|
运维 Cloud Native 测试技术
极氪汽车 APP 系统云原生架构转型实践
极氪汽车 APP 系统云原生架构转型实践
2974 120
极氪汽车 APP 系统云原生架构转型实践
|
开发框架 Dart 开发者
Serverpod 适合全栈 Dart 开发吗?
Serverpod 是一款适用于全栈Dart开发的框架,尤其适合熟悉Dart的开发者。它提供了Docker部署、代码自动生成、数据库连接等功能,简化了前后端开发流程。通过Serverpod,可以创建单体服务架构,但处理复杂业务时可能需要借助其他语言的丰富生态。框架包括对postgres和redis的支持,以及可视化工具Insights。开发步骤涉及安装、创建项目、启动服务和配置文件。Serverpod还允许动态生成接口和数据库代码,简化CURD操作。虽然适合简单到中等复杂度的应用,对于更复杂需求,可能需要结合其他语言或服务。
442 1
Serverpod 适合全栈 Dart 开发吗?
|
缓存
Microsoft Store微软商店更新失败/无法更新应用解决方法
Microsoft Store微软商店更新失败/无法更新应用解决方法
12753 0
|
存储 安全 数据安全/隐私保护
基于单片机的电子密码锁设计
基于单片机的电子密码锁设计
722 0
基于单片机的电子密码锁设计
|
架构师 Java 程序员
写给零基础小白看的入门级 Java 基本语法,强烈推荐(2)
写给零基础小白看的入门级 Java 基本语法,强烈推荐
241 0
写给零基础小白看的入门级 Java 基本语法,强烈推荐(2)
|
人工智能 Linux API
人工智能识病虫害,API来提前防治
通过API的形式,得以将自己的API能力有偿的让更多的应用和开发者来集成使用,有效的实现了互惠互利的共享经济模式。
8437 0