Scala актеры: получить против реагировать

Позвольте мне сначала сказать, что у меня довольно много опыта в Java, но только недавно я заинтересовался функциональными языками. Недавно яМы начали смотреть на Scala, который кажется очень хорошим языком.

Однако я'читал о СкалеАктерская структура вПрограммирование в Scala, и там'это одна вещь, которую я неТ понять. В главе 30.4 говорится, что с помощьюreact вместоreceive позволяет повторно использовать потоки, что хорошо для производительности, поскольку потоки в JVM дороги.

Означает ли это, что, если я не забуду позвонитьreact вместоreceiveЯ могу начать столько актеров, сколько мне нравится? Прежде чем открыть Scala, яЯ играл с Эрлангом и авторомПрограммирование Erlang может похвастаться порождением более 200 000 процессов без пота. Я'Ненавижу делать это с потоками Java. На какие ограничения я смотрю в Scala по сравнению с Erlang (и Java)?

Кроме того, как этот поток повторно использовать в Scala? Позволять'Предположим, для простоты, что у меня есть только один поток. Будут ли все актеры, с которыми я начинаю, работать последовательно в этой теме, или произойдет какое-то переключение задач? Например, если я запускаю двух актеров, которые пинг-понг сообщают друг другу, я рискну зайти в тупик, если ониначалось в той же теме?

В соответствии сПрограммирование в Scalaнаписание актеров для использованияreact сложнее чем сreceive, Это звучит правдоподобно, так какreact Безразлично»т вернуться Тем не менее, книга продолжает показывать, как вы можете поставитьreact внутри цикла, используяActor.loop, В результате вы получаете

loop {
    react {
        ...
    }
}

который, мне кажется, очень похож на

while (true) {
    receive {
        ...
    }
}

который используется ранее в книге. Тем не менее, книга говорит, что "на практике программам понадобится хотя бы несколько "receive, Так чего мне здесь не хватает? Что можешьreceive сделай этоreact не может, кроме возврата? И почему меня это волнует?

Наконец, я понял, что я не делаюне понимаю: книга постоянно упоминает, как с помощьюreact позволяет отбросить стек вызовов для повторного использования потока. Как это работает? Почему необходимо отказаться от стека вызовов? И почему стек вызовов может быть отброшен, когда функция завершается с помощью исключенияreact), но не тогда, когда он завершается возвратом (receive)?

У меня сложилось впечатление, чтоПрограммирование в Scala приукрашивал некоторые из ключевых вопросов здесь, что является позором, потому что в противном случае этодействительно превосходная книга

Ответы на вопрос(5)

Ваш ответ на вопрос