Спершу скажу, що я маю досить багато досвіду 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 переглянуло деякі ключові питання тут, що шкода, бо інакше це справді відмінна книга.