生成 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 反馈 — 无需本地设置。
此课程中的所有课时
- 为什么使用 Isolate,而不是线程
- 使用 Isolate.run 快速卸载任务
- 生成 isolate 与消息传递
- 执行计算密集型任务而不卡顿