最近有关Dart Isolates的文档

5
我最近开始学习Dart(www.dartlang.org),到目前为止,我真的很喜欢它。其中一个非常有前途的功能是隔离区(isolates),但我不确定如何开始。
迄今为止我找到的文档来自2013年10月的破坏性变更(BREAKING CHANGE: dart:isolate)之前。这封“破坏性变更”电子邮件中的信息相当复杂,而且看起来新的API比旧的API更加复杂。
我有一些问题:
  • dart:isolate API稳定吗?
  • 有没有最新的文档?
  • 是否有任何可用的工作示例?
1个回答

3

我尝试了这个示例,它有效。 https://gist.github.com/olostan/7883315

import "dart:isolate";

void main() {
  print("Starting");
  var sPort = new ReceivePort();
  SendPort rPort;
  sPort.listen((msg) {
    if (msg is SendPort) {
      print("Host got port. sending back");
      rPort = msg;
      rPort.send("Hello!");
    }
    else print("Host got $msg");
    rPort.send(null);
    sPort.close();
  });
  Isolate.spawn(test,sPort.sendPort);
}
void test(sender) {
  var rPort = new ReceivePort();
  sender.send(rPort.sendPort);
  rPort.listen((msg){
    print("Worker got $msg");
    if (msg!=null)
      sender.send("I am worker");
    else rPort.close();
  });
}

孤立体似乎还没有被广泛使用,因此可能仍然存在一些错误。
我记得阅读的最新问题是在孤立体中运行代码的调试。 我不知道这是否已解决。
另外,这也取决于您想在服务器上还是在浏览器中使用孤立体。
据我所知,在虚拟机中更为稳定。


嗨,Günter,谢谢。我从未在服务器上使用过Dart。在Dartium上,我得到了“spawnFunction is not supported from a dom-enabled isolate”的错误。你知道这将来会起作用吗?(我知道我可以使用像这里显示的spawnUri:http://japhr.blogspot.nl/2013/11/new-fangled-dart-isolates.html,但那看起来更加繁琐)。 - Hendrik Jan
哦,我本来计划也加上这个链接的,但显然忘了。不过很高兴你还是找到了它。我在Chris的帖子中看到spawnFunction()不受支持,即使实际上使用了spawn()也会抛出异常。我对这种架构没有更多的信息。我建议在你所引用的Dart组中发布一个问题,这个问题与BREAKING CHANGE有关。 - Günter Zöchbauer
2
@hendrik - 请查看更多示例 is-there-any-example-for-darts-spawnuri-in-library-dartisolate。似乎使用Isolate.spawnUri的额外开销是1)将您的代码放在单独的库中2)处理告诉您孵化的隔离是否良好的“Future”,从那时起,它就完全相同了。 - Argenti Apparatus
如果我在 Isolate.spawn 行后添加 sleep(new Duration(seconds: 5));,那么执行将在生成之前暂停。为什么?如何创建循环呢? - OZ_
spawn 是异步的,这意味着它会在当前的“执行线程”执行所有同步代码后执行,但 sleep 会暂停当前的“线程”,因此所有进一步的执行都将被阻止,直到 sleep 完成。您可以使用 new Future.delayed(new Duration(seconds: 5), () { your delayed code here;}); 来延迟在 isolate.spawn() 后执行代码。在生产代码中应尽量避免使用 sleep - Günter Zöchbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接