Dart孤立的暂停功能未按预期工作

Mik*_*ane 3 concurrency dart dart-isolates

我一直在玩Dart孤立,并且在使用该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));
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的示例中,隔离区基本上只是每2秒打印出一些内容。

从我阅读的文档中,我的理解是上面的代码应该:

  1. 产生隔离
  2. 立即暂停隔离

但是它不起作用,隔离程序仍在运行,即使我告诉它暂停,它也会每2秒打印一次“隔离程序正在运行”。

我知道您可以通过传递可选参数 来在暂停状态下启动隔离。但最终,我希望能够在任何时候都暂停隔离,而不仅仅是立即行动。paused: trueIsolate.spawn(isolateEntryPoint, receivePort, paused: true)...

我可以找到的关于此功能的唯一文档在官方的dart文档中,因此我可能使用了该isolate.pause()函数不正确。但是,无论哪种方式,演示此功能正确用法的代码示例都将不胜感激。

lrn*_*lrn 5

您是正确的,它不能按预期工作。

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

在此代码中,隔离入口点正在运行带有内置延迟的无限循环。它永远不会返回到事件队列。如果您在循环中安排了任何异步操作,它们将永远不会执行。该sleep原始睡觉整个分离,但它是从根本什么都不做(它只是需要更长的时间)没有什么不同。

您尝试“立即暂停”新隔离,但是隔离同时运行,并且当Isolate返回对象时,新隔离已经开始执行其入口点功能。

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