Чтобы исправить вашу реализацию актера, вы должны указать актеру выйти до того, как программа также выйдет.
val printer = actor {
loop {
react {
case "stop" => exit()
case msg => println(msg)
}
}
}
(1 until 1000).par.foreach { printer ! _ }
printer ! "stop"
В обоих ваших примерах есть пулы потоков, включающие поддержку как библиотеки параллелей, так и библиотеки акторов, но они создаются по мере необходимости.
Однако println является поточно-ориентированным, поскольку у него действительно есть блокировка во внутренних органах.
(1 until 1000).par.foreach { println(_) } // is threadsafe
Что касается производительности, есть много факторов. Во-первых, переход от блокировки, за которую борются несколько потоков, к блокировке, используемой только одним потоком (одним действующим лицом), повысит производительность. Во-вторых, если вы собираетесь использовать актеров и хотите производительность, используйте
Акка. Актеры Akka невероятно быстрые по сравнению с актерами scala. Кроме того, я надеюсь, что стандартный вывод, в который println пишет, идет в файл, а не на экран, поскольку использование драйверов дисплея может снизить производительность.
Использование библиотеки Parallels прекрасно для производительности, так как вы можете использовать несколько ядер для своих вычислений. Если каждое вычисление очень мало, попробуйте маршрут актера для централизованной отчетности. Однако, если каждое вычисление является значительным и занимает приличное количество процессорного времени, то придерживайтесь только самого println. Вы действительно не находитесь в ситуации блокировки.