如何在隔离中创建三个无限循环?

时间:2019-07-10 13:41:44

标签: dart

我正在学习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

1 个答案:

答案 0 :(得分:1)

main 隔离结束后,VM将终止整个程序。对您来说,这是在您生成所有三个隔离体之后发生的。没有任何事情可以使主隔离程序保持活动状态,因此整个程序只是结束...最终,当隔离程序关闭时。什么时候取决于时间安排,所以可能会有很大差异。

要使隔离永远存在,可以创建ReceivePort。尝试添加:

var keepalive = ReceivePort();

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

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

这三个隔离程序正在同时运行 。它们都写入相同的输出(stdout),因此输出混合在一起。无法保证print调用是原子的,并且不是,因此,一个隔离中的打印调用可能会发生在另一个隔离中的打印调用中间。

这里发生的是print不仅输出了参数,而且还输出了换行符。这是对stdout的两种不同写入,因此另一个隔离可能在“ Hello”和其后的“ \ n”之间打印其消息。