Dart Isolates 的暂停功能未按预期工作
Dart Isolates' pause function not working as expected
我一直在研究 Dart Isolates,并且 运行 使用 isolate.pause();
函数遇到了问题。
import 'dart:io';
import 'dart:isolate';
main(){
ReceivePort receivePort = new ReceivePort();
Isolate.spawn(isolateEntryPoint, receivePort.sendPort).then((isolate){
isolate.pause(isolate.pauseCapability);
});
}
void isolateEntryPoint(SendPort sendPort){
while(true){
print("isolate is running");
sleep(new Duration(seconds: 2));
}
}
在我的示例中,isolate 基本上每 2 秒打印一次。
根据我在 docs 上阅读的内容,我的理解是上面的代码应该:
- 生成一个隔离体
- 立即暂停隔离
但它不起作用,即使在我告诉它暂停之后,隔离仍然 运行 并且每 2 秒打印一次 "isolate is running"。
我知道您可以通过传入 paused: true
可选参数 启动 处于暂停状态的隔离:
Isolate.spawn(isolateEntryPoint, receivePort, paused: true)...
。然而,最终我希望能够在任何时候暂停隔离,而不是立即暂停。
我能找到的关于使用它的唯一文档是官方 dart 文档,所以我可能错误地使用了 isolate.pause()
函数。但无论哪种方式,都将不胜感激演示此函数正确用法的代码示例。
你是对的,这没有像你预期的那样工作。
隔离暂停功能通过暂停事件队列起作用。当前正在执行的事件将完成,然后在您恢复隔离之前不会处理进一步的事件。暂停不影响 运行ning 代码。
在此代码中,隔离入口点是 运行具有内置延迟的无限循环。它永远不会 returns 到事件队列。如果您在循环中安排任何异步操作,它们将永远不会执行。 sleep
原语休眠整个隔离区,但这与什么都不做没有什么不同(只是需要更长的时间)。
您尝试 "promptly pause" 新隔离,但同时隔离 运行,并且当 Isolate
对象返回时,新隔离已经开始执行其入口点函数。
如果我们不再需要支持编译为 JavaScript 的 isolates,那么将来可能会更改 isolate 功能,以便更热心地处理控制消息,但目前是 isolates control消息实际上是异步的,它们只在 Dart 事件队列的事件之间生效。
我一直在研究 Dart Isolates,并且 运行 使用 isolate.pause();
函数遇到了问题。
import 'dart:io';
import 'dart:isolate';
main(){
ReceivePort receivePort = new ReceivePort();
Isolate.spawn(isolateEntryPoint, receivePort.sendPort).then((isolate){
isolate.pause(isolate.pauseCapability);
});
}
void isolateEntryPoint(SendPort sendPort){
while(true){
print("isolate is running");
sleep(new Duration(seconds: 2));
}
}
在我的示例中,isolate 基本上每 2 秒打印一次。
根据我在 docs 上阅读的内容,我的理解是上面的代码应该:
- 生成一个隔离体
- 立即暂停隔离
但它不起作用,即使在我告诉它暂停之后,隔离仍然 运行 并且每 2 秒打印一次 "isolate is running"。
我知道您可以通过传入 paused: true
可选参数 启动 处于暂停状态的隔离:
Isolate.spawn(isolateEntryPoint, receivePort, paused: true)...
。然而,最终我希望能够在任何时候暂停隔离,而不是立即暂停。
我能找到的关于使用它的唯一文档是官方 dart 文档,所以我可能错误地使用了 isolate.pause()
函数。但无论哪种方式,都将不胜感激演示此函数正确用法的代码示例。
你是对的,这没有像你预期的那样工作。
隔离暂停功能通过暂停事件队列起作用。当前正在执行的事件将完成,然后在您恢复隔离之前不会处理进一步的事件。暂停不影响 运行ning 代码。
在此代码中,隔离入口点是 运行具有内置延迟的无限循环。它永远不会 returns 到事件队列。如果您在循环中安排任何异步操作,它们将永远不会执行。 sleep
原语休眠整个隔离区,但这与什么都不做没有什么不同(只是需要更长的时间)。
您尝试 "promptly pause" 新隔离,但同时隔离 运行,并且当 Isolate
对象返回时,新隔离已经开始执行其入口点函数。
如果我们不再需要支持编译为 JavaScript 的 isolates,那么将来可能会更改 isolate 功能,以便更热心地处理控制消息,但目前是 isolates control消息实际上是异步的,它们只在 Dart 事件队列的事件之间生效。