Является ли scala .io.StdIn.readLine () блокирующим вызовом? - PullRequest
1 голос
/ 16 февраля 2020

Является ли scala .io.StdIn.readLine () блокирующим вызовом?

Из документов нет никаких упоминаний о том, что это блокирующий вызов.

Я хочу сделать что-то вроде этого:

while(true){
    val input = scala.io.StdIn.readLine()
    input match{
        case "quit" =>
            ...
        case "stats" =>
            ...
        case _ =>
            ...
    }
}

Если оно не блокирует, будет ли оно постоянно l oop, устанавливать для входа значение null и каждый раз запускать case _ ?

Если он блокируется, почему он не отображается в документах? Или где я могу найти определение, которое говорит, что оно блокирует?

В общем, как я могу узнать, блокирует ли метод?

1 Ответ

5 голосов
/ 16 февраля 2020

как узнать, блокируется ли метод?

Посмотрите на тип возвращаемого значения метода. Если он возвращает Future, IO или какое-либо другое эффективное значение 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. С другой стороны, если метод возвращает чистое значение, например

def h(v: Int): Int = v + 1

, то лучше предположить, что он блокирует. Здесь h - это блокировка в том смысле, что поток, вызвавший его, блокируется до тех пор, пока не будет вычислено v + 1.

Применяя этот принцип к readLine

def readLine(): String

, мы видим, что он возвращает чистое значение 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 состояний

Считывает символы в часть массива. Этот метод будет блокировать , пока какой-либо вход не станет доступным, не произойдет ошибка ввода-вывода или не будет достигнут конец потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...