dart - Dart 程序究竟何时终止?
问题描述
我想知道 Dart 程序何时终止。
采取以下程序:
import 'dart:isolate';
Future<void> calculateTheAnswer(SendPort port) async {
await Future.delayed(Duration(seconds: 1));
port.send(42);
}
void main() async {
var port = ReceivePort()..listen(print);
await Isolate.spawn(calculateTheAnswer, port.sendPort)
..addOnExitListener(port.sendPort, response: 100);
}
在这里,主隔离生成另一个隔离,该隔离在一秒后仅发送 42。发送答案后,隔离终止,导致退出侦听器触发。实际上,程序输出 42,然后输出 100,因此隔离终止。
但 Dart 程序仍在继续运行。为什么?
解决方案
Dart 程序在其所有隔离项都终止时终止。
如果事件循环中没有更多事件并且不再有 open ,则隔离将终止ReceivePort
。为了实现这一点,Dart VM 跟踪ReceivePort
隔离创建的所有 s。一个极端的例子是void main() => ReceivePort()
,一个不会终止的程序。
通过在最后关闭主隔离中的端口,程序确实终止了:
void main() async {
var port = ReceivePort()..listen(print);
var exitPort = ReceivePort();
exitPort.listen((_) {
port.close();
exitPort.close();
});
await Isolate.spawn(calculateTheAnswer, port.sendPort)
..addOnExitListener(exitPort.sendPort);
}
推荐阅读
- html - 如何在html表中的每一行的末尾给出符号
- laravel - 当请求在laravel中并行时如何使用队列
- python - Pandas 系列 apply lambda: NoneType found,但系列中只有 str 和 list
- mysql - 如何为每个用户创建nodejs不同的mysql连接
- windows - 在 Flutter for Windows 平台中实现浏览按钮
- vba - Split() 函数给出编译错误:标识符无效
- python - 如何在 tkinter 中为我的重试按钮添加功能?
- python - Python:将变量输出到现有的 Excel 工作表上
- r - 带有着色级别的 Bland-Altman 的 Data.Frame 格式
- xslt - 是否可以使用只有背景颜色但没有文本内容的 xsl fo 创建块?