Реализую парсер файлов, в каждой папке фиксировано должно быть по 288 файлов, но иногда происходят сбои и создаётся новый файл и данные пишутся туда, но старый файл также остаётся с тем,что туда записалось до перерыва работы(без тех данных которые необходимо спарсить), поэтому не могу сделать буфферизированый канал, так как заранее невозможно предсказать сколько будет файлов и далее при чтение из канала и сложение все в сумму, результат получается верный, но не могу выйти из цикла, пробовал различные варианты но ничего не выход код представлен ниже.
// вывод массив байтов
out := make(chan []byte)
var wg sync.WaitGroup
wg.Add(threads)
for i := 0; i < threads;i++{
go func() {
Run(done,cmd,out)
wg.Done()
}()
}
go func() {
wg.Wait()
close(out)
}()
channelOctets := make(chan int64)
wg.Add(threads)
for i:=0;i < threads;i++{
go func() {
GetOctets(done,out,channelOctets)
wg.Done()
}()
}
go func() {
wg.Wait()
close(channelOctets)
}()
//не работает
for test := range channelOctets{
Octets += test
}
//тоже не выходит из цикла
Loop:
for {
select{
case octet,ok := <-channelOctets:
if !ok{
break Loop
}
Octets +=octet
case <-done:
return
}
}
fmt.Println("=================================")
fmt.Printf("%d\n",Octets)
fmt.Println("=================================")
func GetOctets(done <-chan struct{},out <-chan []byte,octets chan<- int64){
loop: for o := range out{
first := bytes.Index(o,[]byte("Total Octets"))
last := bytes.Index(o,[]byte("Total Packets"))
if first == -1 || last == -1 || len(o) < minLenght{
break loop
}
var pattern= "[-+]?([0-9]*\\.[0-9]+|[0-9]+)"
re := regexp.MustCompile(pattern)
octet := re.FindAllString(string(o[first:last]),1)
select {
case octets <- parsetoint(octet[0]):
case <-done:
}
}
}
func Run(done <-chan struct{},cmdCom <- chan string,result chan<- []byte){
for c := range cmdCom{
cmd, err := exec.Command("sh","-c",c).Output()
if err != nil {
fmt.Println(err)
}
select {
case result <- cmd:
case <-done:
}
}
}