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

How to create three infinity loop inside isolate?

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

一旦 main isolate 结束,VM 将终止整个程序。对于您来说,这发生在您生成了所有三个分离株之后。没有什么能让主隔离保持活动状态,所以整个程序就结束了……最终,当隔离完成关闭时。这取决于时间,因此可能会有很大差异。

要使隔离物永远存活,您可以创建一个 ReceivePort。尝试添加:

var keepalive = ReceivePort();

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

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

三个分离株运行同时。它们都写入相同的输出 (stdout),因此输出会混合在一起。无法保证 print 调用是原子的,而事实并非如此,因此一个 isolate 中的 print 调用可能发生在另一个 isolate 中的 print 调用中间。

这里发生的是 print 不只是打印参数,之后还会打印一个换行符。这是对 stdout 的两次不同写入,因此另一个 isolate 可以在 "Hello" 和其后的“\n”之间打印其消息。