【问题标题】:How to create three infinity loop inside isolate?如何在隔离内创建三个无限循环?
【发布时间】:2019-07-10 13:41:44
【问题描述】:

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

【问题讨论】:

    标签: dart dart-isolates


    【解决方案1】:

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

    要使隔离区永远存在,您可以创建一个ReceivePort。试试加法:

    var keepalive = ReceivePort();
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-24
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多