Go Lang Multi ожидания группы и таймер останавливается в конце - PullRequest
0 голосов
/ 02 февраля 2019

я написал следующий код для запуска до тех пор, пока кто-нибудь не выйдет из программы вручную.

это

  • ----- проверьте, существует ликаждую 1 секунду

  • ----- если доступно, прочитайте файл и напечатайте содержимое файла построчно

, для этого у меня естьсначала вызовите функцию из основного, а затем я вызываю группу ожидания и снова вызываю функцию оттуда для выполнения вышеупомянутых задач.

пожалуйста, проверьте, правильно ли я написал исходный код, как я новичок на GO

плюс это запускается только один раз и останавливается ... я хочу, чтобы он сохранился и посмотрел, существует ли файл

, пожалуйста, помогите мне

 package main

import (
    "encoding/csv"
    "fmt"
    "io"
    "log"
    "os"
    "sync"
    "time"
)

func main() {
    mainfunction()
}

//------------------------------------------------------------------

func mainfunction() {
    var wg sync.WaitGroup
    wg.Add(1)

    go filecheck(&wg)

    wg.Wait()
    fmt.Printf("Program finished \n")

}

func filecheck(wg *sync.WaitGroup) {

    for range time.Tick(time.Second * 1) {
        fmt.Println("Foo")

        var wgi sync.WaitGroup
        wgi.Add(1)

        oldName := "test.csv"
        newName := "testi.csv"

        if _, err := os.Stat(oldName); os.IsNotExist(err) {
            fmt.Printf("Path does not exsist \n")
        } else {
            os.Rename(oldName, newName)
            if err != nil {
                log.Fatal(err)
            }
            looping(newName, &wgi)
        }
        fmt.Printf("Test complete \n")
        wgi.Wait()
        wg.Done()
        time.Sleep(time.Second * 5)
    }
}

func looping(newName string, wgi *sync.WaitGroup) {
    file, _ := os.Open(newName)
    r := csv.NewReader(file)
    for {
        record, err := r.Read()
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }

        var Date = record[0]
        var Agent = record[1]
        var Srcip = record[2]
        var Level = record[3]

        fmt.Printf("Data: %s Agent: %s Srcip: %s Level: %s\n", Date, Agent, Srcip, Level)
    }
    fmt.Printf("Test complete 2 \n")
    wgi.Done()

    fmt.Printf("for ended")
}

1 Ответ

0 голосов
/ 02 февраля 2019

Короткий ответ: у вас есть это в цикле:

    wg.Done()

, что заставляет основную программу завершиться, как только файл будет прочитан один раз.


Более длинный ответ заключается в том, что вы не используете группы ожидания правильно, ИМХО.Например, нет абсолютно никакого смысла передавать WaitGroup в looping.

Не ясно, что ваш код пытается выполнить - вам определенно не нужны никакие программы для простого выполнения задачи, которую вы выполняетеуказано - это может быть все без параллелизма и, следовательно, более простой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...