0Pricing
Dart Academy · 课时

生成 isolate 与消息传递

通过 SendPort 和 ReceivePort 通信

生成 isolate 与消息传递 是 CoddyKit 上的免费 Dart Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Dart Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Dart Academy 课程共包含 4 节课。

手动管理

对于长期运行且通信频繁的工作单元,您可以使用 Isolate.spawn 自己创建一个隔离单元。这样,您可以完全控制它的生命周期。

入口点

Isolate.spawn 需要一个顶层函数作为入口点,还需要一个在启动时传给它的参数。

Isolate.spawn(worker, message);

认识 ReceivePort

ReceivePort 就像您的邮箱。您可以监听它,接收其他隔离单元发送给您的消息。📥

final port = ReceivePort();
port.listen((msg) => print(msg));

认识 SendPort

每个 ReceivePort 都会提供一个 SendPort。持有这个 SendPort 的任何一方,都可以向您的邮箱投递消息。

final SendPort tx = port.sendPort;

交接端口

要开始通信,请将一个 SendPort 作为创建参数传给新的隔离单元。这样,它就知道该向哪里回复了。

Isolate.spawn(worker, port.sendPort);

工作单元回复

在工作单元内部,使用您收到的 SendPort,将结果发送回主隔离单元。

void worker(SendPort tx) {
  tx.send('done');
}

握手

一种常见模式是进行双向握手:工作单元先发回自己的 SendPort,这样双方就都能向对方发送消息了。

只能发送可传输的数据

消息必须是可发送的,例如数字、字符串、列表、映射和 SendPort。打开的文件或函数之类的对象无法跨越边界。

读取回复

回到主隔离单元后,您的 ReceivePort 的 listen 回调会在每次收到回复时触发。请按消息到达的顺序处理它们。

关闭端口

完成后,请调用 port.close()。打开的 ReceivePort 会让程序保持运行,因此关闭它可以让程序干净地退出。

终止隔离单元

保留 Isolate 引用,并调用 isolate.kill() 来停止不再需要的工作单元。请及时释放其资源。

快速检查

要接收消息,您应该监听哪个端口?

回顾

使用 Isolate.spawn 创建隔离单元,然后传入 SendPort,让隔离单元彼此通信。只发送可传输的数据,并在完成后关闭端口。✅

常见问题解答

「生成 isolate 与消息传递」课时是免费的吗?

是的 — 「生成 isolate 与消息传递」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Dart Academy 课程的其余内容,请升级到 CoddyKit PRO。 Dart Academy 课程共包含 4 节课。

「生成 isolate 与消息传递」这节课中我会学到什么?

通过 SendPort 和 ReceivePort 通信 你通过在浏览器中直接运行的动手代码来练习 Dart Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Dart Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Dart Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「生成 isolate 与消息传递」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Dart Academy 课中编写并运行代码吗?

能。每节 Dart Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么使用 Isolate,而不是线程
  2. 使用 Isolate.run 快速卸载任务
  3. 生成 isolate 与消息传递
  4. 执行计算密集型任务而不卡顿
← 返回 Dart Academy