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 上阅读的内容,我的理解是上面的代码应该:

  1. 生成一个隔离体
  2. 立即暂停隔离

但它不起作用,即使在我告诉它暂停之后,隔离仍然 运行 并且每 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 事件队列的事件之间生效。