Go lang multi waitgroup 和 timer 最后停止

我已经编写了以下代码以便运行直到有人手动退出程序。

它确实是

  • ----- 每 1 秒检查一次是否存在

  • ----- 如果可用则读取文件并逐行打印文件内容

为此,我首先从 main 调用一个函数,然后我调用一个 waitgroup 并从那里再次调用一个函数来完成上述任务。

请检查我是否正确编写了源代码,因为我是 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")

}


繁星coding
浏览 109回答 1
1回答

皈依舞

简短的回答是你在循环中有这个:    wg.Done()这使得主 goroutine 在文件被读取一次后立即退出。更长的答案是您没有在这里正确使用等待组,恕我直言。例如,将 a 传递给 绝对没有WaitGroup意义looping。目前尚不清楚您的代码试图完成什么 - 您当然不需要任何 goroutines 来执行您指定的任务 - 它可以在没有并发的情况下全部消失,因此代码更简单。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go