0

我正在学习 Dart 并使用 Isolate。我编写了下一个代码,并期望它将创建三个可以无限工作的隔离进程:

main()  {

  Isolate.spawn(echo, "Hello");
  Isolate.spawn(echo, "Hello2");
  Isolate.spawn(echo, "Hello3");

}


void echo(var message)
{
  while(true)
  {
    print(message);
  }
}

但是我得到了非常奇怪的输出,例如(每次都不同):

$ dart app.dart
Hello
Hello
Hello
Hello
HelloHello2

Hello
Hello3
Hello2
Hello
4

1 回答 1

1

一旦隔离结束,VM 将终止整个程序。对你来说,这发生在你产生了所有三个分离物之后。没有什么可以让主隔离区保持活动状态,所以整个程序就结束了……最终,当隔离区完成关闭时。什么时候取决于时间,所以它可以变化很大。

为了使隔离永远存在,您可以创建一个ReceivePort. 试试加法:

var keepalive = ReceivePort();

到你的程序,那么它应该永远运行。

此外,打印不仅仅是包含 hello 的行列表,它们是混合在一起的。

三个隔离器同时运行。它们都写入相同的输出(stdout),因此输出混合在一起。不能保证print调用是原子的,但事实并非如此,因此一个隔离中的打印调用可能发生在另一个隔离中的打印调用中间。

这里发生的事情print不仅是打印参数,它还会在之后打印一个换行符。这是对标准输出的两次不同写入,因此另一个隔离可以在“Hello”和它后面的“\n”之间打印其消息。

于 2019-07-10T15:39:04.497 回答