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

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

Тем не менее, я читал об Scala Actor Framework вProgramming in Scalaи есть одна вещь, которую я не понимаю. В главе 30.4 говорится, что с помощьюreact вместоreceive позволяет повторно использовать потоки, что хорошо для производительности, поскольку потоки в JVM дороги.

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

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

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

loop {
    react {
        ...
    }
}

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

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

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

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

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

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

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