Спершу скажу, що я маю досить багато досвіду Java, але лише нещодавно зацікавився функціональними мовами. Нещодавно я почав дивитися на Scala, який здається дуже приємною мовою.
Однак я читав про програму Scaler's Actor в програмуванні в Scala , і є одне, чого я не розумію. У главі 30.4 сказано, що використання reactзамість цього receiveдозволяє повторно використовувати потоки, що добре для продуктивності, оскільки потоки є дорогими в JVM.
Чи означає це, що поки я пам'ятаю дзвонити reactзамість receive, я можу почати стільки акторів, скільки мені подобається? Перш ніж відкрити Scala, я грав з Erlang, і автор програми програмування 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 переглянуло деякі ключові питання тут, що шкода, бо інакше це справді відмінна книга.