Dart Isolates的暂停功能无法按预期工作

时间:2018-01-06 18:05:45

标签: concurrency 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));
  }
}

在我的例子中,隔离基本上只是每2秒打印一次。

从我在docs上看到的内容,我的理解是上面的代码应该:

  1. 产生隔离
  2. 立即停止隔离
  3. 但它不起作用,隔离仍然在运行并且每隔2秒打印一次“隔离正在运行”,即使我告诉它暂停。

    我知道您可以通过传入paused: true可选参数启动处于暂停状态的隔离: Isolate.spawn(isolateEntryPoint, receivePort, paused: true)...。但最终我希望能够在任何时候暂停隔离,而不仅仅是蝙蝠。

    我可以找到关于使用它的唯一文档是在官方dart文档上,所以我可能错误地使用了isolate.pause()函数。但无论哪种方式,都会非常感谢演示正确使用此函数的代码示例。

1 个答案:

答案 0 :(得分:5)

你说的没错,这是不正常的。

隔离暂停功能通过暂停事件队列来工作。当前正在执行的事件将完成,然后在您恢复隔离之前不会处理任何其他事件。暂停不会影响正在运行的代码。

在此代码中,隔离入口点正在运行具有内置延迟的无限循环。它永远不会返回事件队列。如果您在循环中安排了任何异步操作,它们将永远不会执行。 sleep原语睡眠整个孤立,但它与完全没有任何不同(它只需要更长时间)。

您尝试“立即暂停”新隔离,但隔离并发运行,并且在返回Isolate对象时,新隔离已经开始执行其入口点函数。

如果我们不再需要支持编译为JavaScript的隔离,那么将来可能会更改隔离功能,更加急于处理控制消息,但是当前隔离控制消息实际上是异步的,它们是仅在Dart事件队列的事件之间生效。