【发布时间】:2015-06-05 19:18:10
【问题描述】:
我正在使用 Scalaz Stream 库并尝试创建一个简单的控制台应用程序。
我按照教程 scalaz streams 进行操作,他们有一个控制台读写示例。
但我遇到了一个奇怪的问题,我不确定如何解决。
这是我的代码:
import scala.concurrent.duration._
import scalaz.concurrent.Task
object StreamApp extends App {
(new StreamExec).go3
}
class StreamExec {
def gets: Task[String] = Task {
scala.io.StdIn.readLine()
}
def puts(ln: String, answer: String): Task[Boolean] = Task {
println(ln)
ln.contains(answer)
}
def go3 {
import scalaz.stream.Process
val q = Seq("1", "2", "3") map { case p =>
println(s"Say $p")
val in = Process eval gets
val out = in flatMap { line =>
Process eval puts(line, p)
}
out.runLog.attemptRunFor(5.seconds)
}
println(q)
}
}
当我运行它时,输出看起来像这样
background log: info: Say 1
1
background log: info: 1
background log: info: Say 2
background log: info: Say 3
3
3
background log: info: 3
background log: info: List(\/-(Vector(true)), -\/(java.util.concurrent.TimeoutException), \/-(Vector(true)))
1 很好,2 5 秒后超时失败,然后 3 需要输入两次。
问题在于,当进程按时失败时,控制台输入并未解除阻塞(未终止)并且仍在等待用户输入。
我尝试用 future 重现它,但遇到了同样的问题。
谢谢。
【问题讨论】:
标签: scala functional-programming scalaz scalaz-stream