Dart 如何知道与异步代码相关的程序何时完成
How does Dart know when a program has finished in relation to asynchronous code
我一直在学习 Dart 中的事件循环和异步代码执行。以下是我的理解:
- Dart 运行s main 中的同步代码优先。
- 任何已完成的期货都放在事件 queue 上,并以 FIFO 顺序获得 运行。
- 任何微任务事件都会在事件中的下一个事件之前得到处理 queue。
我缺少的部分是未完成的未来呢?如果你有这样的事情怎么办:
final myFuture = Future<int>.delayed(
Duration(seconds: 1),
() => 42,
);
在那一秒的延迟中,假设所有同步代码、微任务和事件 queue 任务都已完成。 Dart 如何知道它不应该终止程序?未完成的期货有没有小持有人?
我不知道我的标题是否准确反映了我的要求。随意编辑它。
Dart 程序的 life-time 取决于它 运行 的位置。
浏览器中的代码 运行 不会停止,除非页面消失。网页不会像脚本或应用程序那样结束。
因此,您可能真正要问的是 Dart VM 上的程序 运行 何时停止。简短的回答是:当没有更多事可做时(在主隔离中)。
当 main isolate 完成后程序结束。这是 运行 的第一个隔离。如果你启动新的 isolate,它们不会让程序自己保持活动状态,所以确保在你的程序完成之前保持主 isolate 活动。
当无事可做时,隔离就完成了,并且没有好的方法来接收指令来做更多的事情。
这意味着:
- 没有密码运行ning.
- 事件和微任务队列为空。
- 没有预定的计时器或未完成的 I/O 操作(您可以将它们视为保存在单独的内部工作队列中,当它们准备好结果时,它们会触发主事件队列中的事件。这些队列也需要为空才能完成程序。
- 没有打开的接收端口(ReceivePort, RawReceivePort)。
这意味着无事可做,也没有开放的通信渠道来接收消息。
保持 isolate 活动的传统方法(可能是因为真正的计算是在不同的 isolate 中完成的)是创建一个 ReceivePort
,然后在其他一切都完成后关闭它(你d 可能会通过向 receive-port) 发送事件来通知他们。
我一直在学习 Dart 中的事件循环和异步代码执行。以下是我的理解:
- Dart 运行s main 中的同步代码优先。
- 任何已完成的期货都放在事件 queue 上,并以 FIFO 顺序获得 运行。
- 任何微任务事件都会在事件中的下一个事件之前得到处理 queue。
我缺少的部分是未完成的未来呢?如果你有这样的事情怎么办:
final myFuture = Future<int>.delayed(
Duration(seconds: 1),
() => 42,
);
在那一秒的延迟中,假设所有同步代码、微任务和事件 queue 任务都已完成。 Dart 如何知道它不应该终止程序?未完成的期货有没有小持有人?
我不知道我的标题是否准确反映了我的要求。随意编辑它。
Dart 程序的 life-time 取决于它 运行 的位置。
浏览器中的代码 运行 不会停止,除非页面消失。网页不会像脚本或应用程序那样结束。
因此,您可能真正要问的是 Dart VM 上的程序 运行 何时停止。简短的回答是:当没有更多事可做时(在主隔离中)。
当 main isolate 完成后程序结束。这是 运行 的第一个隔离。如果你启动新的 isolate,它们不会让程序自己保持活动状态,所以确保在你的程序完成之前保持主 isolate 活动。
当无事可做时,隔离就完成了,并且没有好的方法来接收指令来做更多的事情。 这意味着:
- 没有密码运行ning.
- 事件和微任务队列为空。
- 没有预定的计时器或未完成的 I/O 操作(您可以将它们视为保存在单独的内部工作队列中,当它们准备好结果时,它们会触发主事件队列中的事件。这些队列也需要为空才能完成程序。
- 没有打开的接收端口(ReceivePort, RawReceivePort)。
这意味着无事可做,也没有开放的通信渠道来接收消息。
保持 isolate 活动的传统方法(可能是因为真正的计算是在不同的 isolate 中完成的)是创建一个 ReceivePort
,然后在其他一切都完成后关闭它(你d 可能会通过向 receive-port) 发送事件来通知他们。