Задать вопрос
@jajabin

Почему не выходит из цикла?

Реализую парсер файлов, в каждой папке фиксировано должно быть по 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:

            }

        }



}
  • Вопрос задан
  • 159 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы