我正在学习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
答案 0 :(得分:1)
main 隔离结束后,VM将终止整个程序。对您来说,这是在您生成所有三个隔离体之后发生的。没有任何事情可以使主隔离程序保持活动状态,因此整个程序只是结束...最终,当隔离程序关闭时。什么时候取决于时间安排,所以可能会有很大差异。
要使隔离永远存在,可以创建ReceivePort
。尝试添加:
var keepalive = ReceivePort();
到您的程序,那么它应该永远运行。
此外,打印不仅仅是包含问候的行的列表,它们是混杂在一起的。
这三个隔离程序正在同时运行 。它们都写入相同的输出(stdout),因此输出混合在一起。无法保证print
调用是原子的,并且不是,因此,一个隔离中的打印调用可能会发生在另一个隔离中的打印调用中间。
这里发生的是print
不仅输出了参数,而且还输出了换行符。这是对stdout的两种不同写入,因此另一个隔离可能在“ Hello”和其后的“ \ n”之间打印其消息。