Основная цель - переработать Задание 7 так, чтобы вывод обработанных команд выполнялся параллельно. При старте программы должно быть создано, в дополнение к существующему основному потоку, еще три дополнительных. Дадим им условные имена:
- main - основной поток;
- log - поток для вывода в консоль;
- file1 - первый поток для вывода в файл;
- file2 - второй поток для вывода в файл.
Основная логика обработки меняется таким образом, что блок команд, сразу после своего формирования должен быть отправлен в консоль и файл одновременно. При этом, отправка блока в файл должна быть распределена между двумя потоками.
Следует обратить внимание на недостаточную точность часов для формирования уникального имени. Необходимо, сохранив timestamp в имени, добавить дополнительную секцию, которая будет гарантированно отличаться.
В условиях многопоточной обработки ведение логов может оказаться затратной процедурой и невольным синхронизатором потоков. В данной задаче необходимо ввести дополнительные счетчики операций, которые должны быть выведены на консоль в конце работы программы. На каждый дополнительный поток два счетчика:
- количество блоков
- общее количество команд в блоках
В основном потоке три счетчика:
- количество строк считанных из файла (команды + { + } )
- количество команд
- количество блоков
Для последовательности
{
cmd1
cmd2
{
cmd3
cmd4
}
cmd5
cmd6
}
метрики должны иметь значения соответственно:
- main поток - 10 строк, 6 команд, 1 блок
- log поток - 1 блок, 6 команд
- file1 поток - 1 блок, 6 команд
- file2 поток - 0 блоков, 0 команд
Опционально провести эксперимент по подбору оптимального количества потоков. Необходимо существенно увеличить CPU нагрузку в потоках для записи в файл, например сделать очень большое количество случайных перемешиваний или подсчетов hash. Подойдет любая операция, которая сильно тратит только CPU. Делать эту операцию циклически, наблюдая за скоростью чтения данных с диска, до тех пор, пока чтение с диска существенно не сократится. Вторым этапом будет увеличение количества потоков, увеличивать количество потоков следует медленно, продолжная наблюдать за скорость чтения с дисков. Должны заметить следующую динамику:
- увеличение CPU стоимости в одном потоке приводит к снижению скорости чтения с диска
- увеличение количества потоков приводит к увеличению скорости чтения с диска
- дальнейшее увеличение количества опять приводит к снижению скорости чтения Обратить внимание на то, что проведению эксперимента могут помешать любые очереди, которые могут быть в программе.
Бинарный файл должен называться bulkmt. Результатом работы должен быть пакет bulkmt, опубликованный на bintray.
Задание считается выполненным успешно, если после установки пакета и запуска с тестовыми данными вывод соответствует описанию Задания 7 с дополнительным выводом метрик. Данные подаются на стандартный вход построчно с паузами в 1 секунду для визуального контроля и в существенно большем объеме без пауз.
Будет отмечен способ взаимодействия главного потока с дополнительными. Соответствие выходных метрик поданным на вход данным.