【问题标题】:Dart Isolates' pause function not working as expectedDart Isolates 的暂停功能未按预期工作
【发布时间】:2018-06-16 06:01:12
【问题描述】:

我一直在玩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. 立即暂停该隔离

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

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

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

【问题讨论】:

    标签: dart concurrency dart-isolates


    【解决方案1】:

    您说得对,这并没有按您的预期工作。

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

    在这段代码中,isolate 入口点正在运行一个带有内置延迟的无限循环。它永远不会返回到事件队列。如果您在循环中安排了任何异步操作,它们将永远不会执行。 sleep 原语使整个隔离区处于休眠状态,但这与什么都不做没有什么不同(只是需要更长的时间)。

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 2020-04-28
      • 2021-08-27
      • 1970-01-01
      • 2012-10-07
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多