otus_10_homework

Условие

Основная цель переработать Задание 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 секунду для визуального контроля и в существенно большем объеме без пауз.

Будет отмечен способ взаимодействия главного потока с дополнительными. Соответствие выходных метрик поданным на вход данным.