scala.io.StdIn.readLine() 是阻塞调用吗?
Is scala.io.StdIn.readLine() a blocking call?
scala.io.StdIn.readLine() 是阻塞调用吗?
From the docs,没有提到它是阻塞调用。
我想做这样的事情:
while(true){
val input = scala.io.StdIn.readLine()
input match{
case "quit" =>
...
case "stats" =>
...
case _ =>
...
}
}
如果不阻塞,会不会一直循环,每次都把input设为null,然后触发case _?
如果它是阻塞的,为什么它没有显示在文档中?或者我在哪里可以看到它正在阻塞的定义?
一般来说,我如何知道方法是否阻塞?
how can I know whether or not a method is blocking?
查看方法的return类型。如果它是 returning Future
、IO
或其他一些 effectful 值 F[A]
包装 纯 值A
能够对异步计算进行建模,然后假设它是非阻塞的。例如考虑
def f(v: Int): Future[Int] = Future(v + 1)
def g(v: Int): IO[Int] = IO(v + 1)
这里 f
和 g
是非阻塞的,因为调用它们的线程在计算 v + 1
之前不会被阻塞。另一方面,如果该方法是 return 像这样的纯值
def h(v: Int): Int = v + 1
那么最好假设它是阻塞的。这里 h
在调用它的线程被阻塞的意义上是阻塞的,直到 v + 1
被计算。
将此原则应用于 readLine
def readLine(): String
我们看到它是 returning 纯值 String
所以我们假设它是阻塞的。分析源代码,我们看到以下堆栈跟踪
java.io.Reader#read(char[], int, int)
java.io.BufferedReader#fill
java.io.BufferedReader#readLine(boolean)
java.io.BufferedReader#readLine()
scala.io.StdIn#readLine
其中 read
表示
Reads characters into a portion of an array. This method will block
until some input is available, an I/O error occurs, or the end of the
stream is reached.
scala.io.StdIn.readLine() 是阻塞调用吗?
From the docs,没有提到它是阻塞调用。
我想做这样的事情:
while(true){
val input = scala.io.StdIn.readLine()
input match{
case "quit" =>
...
case "stats" =>
...
case _ =>
...
}
}
如果不阻塞,会不会一直循环,每次都把input设为null,然后触发case _?
如果它是阻塞的,为什么它没有显示在文档中?或者我在哪里可以看到它正在阻塞的定义?
一般来说,我如何知道方法是否阻塞?
how can I know whether or not a method is blocking?
查看方法的return类型。如果它是 returning Future
、IO
或其他一些 effectful 值 F[A]
包装 纯 值A
能够对异步计算进行建模,然后假设它是非阻塞的。例如考虑
def f(v: Int): Future[Int] = Future(v + 1)
def g(v: Int): IO[Int] = IO(v + 1)
这里 f
和 g
是非阻塞的,因为调用它们的线程在计算 v + 1
之前不会被阻塞。另一方面,如果该方法是 return 像这样的纯值
def h(v: Int): Int = v + 1
那么最好假设它是阻塞的。这里 h
在调用它的线程被阻塞的意义上是阻塞的,直到 v + 1
被计算。
将此原则应用于 readLine
def readLine(): String
我们看到它是 returning 纯值 String
所以我们假设它是阻塞的。分析源代码,我们看到以下堆栈跟踪
java.io.Reader#read(char[], int, int)
java.io.BufferedReader#fill
java.io.BufferedReader#readLine(boolean)
java.io.BufferedReader#readLine()
scala.io.StdIn#readLine
其中 read
表示
Reads characters into a portion of an array. This method will block until some input is available, an I/O error occurs, or the end of the stream is reached.