How to create three infinity loop inside isolate?

Issue

I am learning Dart and working with Isolate. I wrote next code, and expected that it will create three isolate process that will work infinity:

main()  {

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

}


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

But I am getting very strange output like (every time different):

$ dart app.dart
Hello
Hello
Hello
Hello
HelloHello2

Hello
Hello3
Hello2
Hello

Solution

The VM will terminate the entire program as soon as the main isolate ends. For you, that happens after you have spawned all three isolates. There is nothing keeping the main isolate alive, so the entire program just ends … eventually, when the isolate is done shutting down. When that is depends on timing, so it can vary quite a lot.

To keep an isolate alive forever, you can create a ReceivePort. Try addig:

var keepalive = ReceivePort();

to your program, then it should keep running forever.

Also, the printing is not just a list of lines containing hello’s, they are intermixed.

The three isolates are running concurrently. They all write to the same output (stdout), so the outputs get intermixed. There is no promise that a print call is atomic, and it isn’t, so a print call in one isolate can happen in the middle of a print call in another isolate.

What happens here is that print doesn’t just print the argument, it also prints a newline afterwards. Those are two different writes to stdout, so it is possible for another isolate to print its message between the “Hello” and the “\n” following it.

Answered By – lrn

Answer Checked By – Terry (FlutterFixes Volunteer)

Leave a Reply

Your email address will not be published.