Позвольте мне сначала сказать, что у меня довольно большой опыт работы с Java, но я только недавно заинтересовался функциональными языками. Недавно я начал смотреть на Scala, который кажется мне очень хорошим языком.
Однако я читал о фреймворке Scala Actor в Программе на Scala , и есть одна вещь, которую я не понимаю. В главе 30.4 говорится, что использование react
вместо receive
позволяет повторно использовать потоки, что хорошо для производительности, поскольку потоки дороги в JVM.
Означает ли это , что, до тех пор , как я помню , чтобы позвонить react
вместо receive
, я могу начать , как многие актеры , как мне нравится? Прежде чем открыть для себя Scala, я играл с Erlang, и автор книги Programming 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» здесь замалчивает некоторые ключевые вопросы, что очень досадно, потому что в остальном это действительно отличная книга.