Я пишу приложение, которое читает относительно большие текстовые файлы, проверяет и преобразует данные (каждая строка в текстовом файле является собственным элементом, имеется около 100 миллионов элементов в файле) и создает какой-то вывод. Уже существует многопоточное Java-приложение (использующее BlockingQueue
между чтением / обработкой / сохранением задач), но я хочу реализовать приложение Scala, которое делает то же самое.
Akka кажется очень популярным выбором для создания параллельных приложений. К сожалению, из-за асинхронной природы акторов я до сих пор не понимаю, что может или не может сделать один актер, например если я могу использовать актеров как традиционных рабочих, которые производят какие-то вычисления.
В нескольких документах говорится, что Актеры никогда не должны блокироваться, и я понимаю, почему. Но в приведенных примерах для кода блокировки всегда упоминаются только такие вещи, как блокировка ввода-вывода файлов / сети ... вещи, которые заставляют актера ждать в течение короткого периода времени, что, конечно, плохо.
Но что, если актер «блокирует», потому что на самом деле он делает что-то полезное, а не ждет? В моем случае обработка и преобразование одной строки / элемента текста занимает 80 мс, что довольно долго (чистая обработка, без операций ввода-вывода). Может ли эта работа выполняться актером напрямую или я должен использовать Future вместо этого (но тогда, если мне все равно придется использовать Futures, зачем вообще использовать Akka ...) ?.
Документы и примеры Akka показывают, что актеры могут выполнять работу напрямую. Но кажется, что авторы делают только очень упрощенную работу (например, вызывают фильтр в строке или увеличивают счетчик и все). Я не знаю, делают ли они это для того, чтобы документы оставались простыми и лаконичными, или потому, что вам действительно не следует делать больше этого внутри актера.
Как бы вы спроектировали приложение на основе Akka для моего варианта использования (чтение текстового файла, обработка каждой строки, что занимает довольно много времени, в конечном итоге сохранение результата)? Или это какая-то проблема, не подходящая для Акки?
Future
внутри общего пула потоков не рекомендуется, так как это также вызывает нехватку потоков. 80 мс для реальных вычислений - это нормально, так как это более-менее стабильное значение, вы можете использовать процессор на полную мощность - person dk14   schedule 14.09.2015