我有一个简单的程序:
import scalaz._
import stream._
object Play extends App {
val in1 = io.linesR("C:/tmp/as.txt")
val in2 = io.linesR("C:/tmp/bs.txt")
val p = (in1 merge in2) to io.stdOutLines
p.run.run
}
文件as.txt
包含 5 个a
,文件bs.txt
包含 3 个b
。我看到这种输出:
a
b
b
a
a
b
a
a
a
但是,当我更改in2
如下声明时:
val in2 = io.stdInLines
然后我得到了我认为是意外的行为。根据文档1,程序应该根据哪个流更快地提供数据,从每个流中非确定性地提取数据。这应该意味着我看到一堆a
s 立即打印到控制台,但这根本不是发生的事情。
确实,在我按下 之前ENTER
,什么都没有发生。很明显,如果我随机选择一个流来获取下一个元素,那么行为看起来很像我所期望的,然后,如果该流被阻塞,合并的进程也会阻塞(即使另一个流包含数据)。
到底是怎么回事?