Задача: реализовать функцию для запуска конкуррентного пайплайна, состоящего из стейджей.
Пайплайн - последовательность действий или процессов, которые выполняются для достижения цели. Стейдж - функция, принимающая канал на чтение и отдающая канал на чтение, внутри в горутине берущая данные из входного канала, выполняющая полезную работу и отдающая результат в выходной канал:
func Stage(in <-chan interface{}) (out <-chan interface{}) {
out = make(chan interface{})
go func() { /* Some work */ }()
return out
}
Требования:
- Параллельное выполнение заданий стейджами.
- Возможность остановить пайплайн через дополнительный сигнальный канал (
done
/terminate
/etc.)
Параллельное(конкурентное) выполнение задач подразумевает, что после обработки порции данных, стейдж передаёт результат в следующий за ним стейдж или на выход пайплайна и принимает в работу (или готов принять в работу) следующую порцию данных. Другими словами, пайплайн не ждёт, когда вся цепочка стейджей обработает один входящий элемент, чтобы принять в обработку следующий. Пока есть данные в канале все стейджи выполняют полезную работу параллельно. Т.е. пайплан из 4 функций по 100 мс каждая для 5 входных элементов должен выполняться гораздо быстрее, чем за 2 секунды (4 * 100 мс * 5).
При необходимости можно выделять дополнительные функции.
Нельзя менять сигнатуры исходных функций.
Для большего понимания см. тесты.
- CI-пайплайн зелёный - 5 баллов
- Добавлены новые юнит-тесты - до 2 баллов
- Проходит тест TestAllStageStop - 2 балла
- Понятность и чистота кода - до 1 баллов
- https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables
go test -v -race -count=100 .