gpt4 book ai didi

Golang多 WaitGroup 和计时器最终停止

转载 作者:IT王子 更新时间:2023-10-29 02:35:42 25 4
gpt4 key购买 nike

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

确实是

  • -----每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")
}

最佳答案

简短的回答是你在循环中有这个:

    wg.Done()

这使得主 goroutine 在文件被读取一次后立即退出。


恕我直言,较长的答案是您没有在此处正确使用 WaitGroup 。例如,将 WaitGroup 传递给 looping 绝对没有意义。

不清楚您的代码试图完成什么 - 您当然不需要任何 goroutines 来执行您指定的任务 - 它可以在没有并发的情况下全部消失,因此代码更简单。

关于Golang多 WaitGroup 和计时器最终停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54493887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com