×
Подсказка
## Подход к выполнению практики
В этой подсказке приводятся указания по способу выполнения практики. В ней рассмотрены алгоритмы реализации функций.
## Функция executePipeline
— Если количество переданных `jobs` нулевое, то сразу заканчиваем работу. В противном случае переходим к следующему шагу.
— Создаем канал на вход — `in`, на выход — `out`. Оба канала типа `chan string`.
— Создаем `sync.WaitGroup`, с помощью которого будем дожидаться окончания всех работ.
— Запускаем работы `job`, каждый раз меняя местами каналы `in` и `out`.
Не забывайте также закрывать каналы там, где это необходимо.
## Функция encryptAndCompress
— Организуем цикл по всем данным из канала `in`.
— Вычисляем `compress`.
— Запускаем горутину, в которой будут запущены еще две горутины. Необходимо дождаться выполнения родительской горутины вне цикла.
— Первая дочерняя горутина считает `encrypt` от исходных данных, вторая — от `compress`. Обе горутины пишут в свой канал.
— В родительской горутине читаем результаты, полученные от дочерних горутин, из каналов. Объединяем их через тильду `~` и пишем в канал `out`.
## Функция multiEncrypt
— Организуем цикл по всем данным из канала `in`.
— Запускаем родительскую горутину. Необходимо дождаться ее выполнения вне цикла.
— Запускаем шесть дочерних горутин, каждая из которых считает `encrypt(th+dataChunk)`. Также вначале каждого результата мы добавляем его номер. Это нужно, потому что горутины считают одновременно. Результаты же должны быть получены в порядке расчета.
— Читаем все результаты шести горутин и сортируем их по возрастанию.
— Удаляем номер расчета из результатов и конкатенируем полученные строки.
— Пишем в канал `out`.
## Функция generateResult
Функция `generateResult` простая: она работает на одной горутине.
Не забывайте, что для быстрой конкатенации строк в цикле используют `strings.Builder`.