Я хочу создать простое приложение, которое будет непрерывно считывать вывод из одного приложения, обрабатывать его и записывать обработанный вывод в стандартный вывод. Это приложение может производить много данных в течение секунды, а затем молчит в течение нескольких минут.
Проблема в том, что алгоритм обработки моих данных довольно медленный, поэтому основной цикл блокируется. Когда цикл заблокирован, я теряю данные, которые приходят и в этот момент.
cmd := exec.Command("someapp")
stdoutPipe, _ := cmd.StdoutPipe()
stdoutReader := bufio.NewReader(stdoutPipe)
go func() {
bufioReader := bufio.NewReader(stdoutReader)
for {
output, _, err := bufioReader.ReadLine()
if err != nil || err == io.EOF {
break
}
processedOutput := dataProcessor(output);
fmt.Print(processedOutput)
}
}()
Вероятно, лучший способ решить эту проблему - это буферизовать весь вывод и обработать его в другом Goroutine, но я не уверен, как реализовать это в Golang. Какой самый идиоматический способ решить эту проблему?