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