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 Здесь были некоторые некоторые ключевые вопросы, и это позор, потому что в остальном это действительно превосходная книга.