Go lang multi waitgroup和计时器最终停止
我编写了以下代码,以便在有人手动退出程序之前一直运行 确实是Go lang multi waitgroup和计时器最终停止,go,Go,我编写了以下代码,以便在有人手动退出程序之前一直运行 确实是 -----每1秒检查一次是否存在 -----如果可用,则读取文件并逐行打印文件内容 为此,我首先从main调用了一个函数 然后我调用一个waitgroup并从那里再次调用一个函数来执行上述任务 请检查我是否正确编写了源代码,因为我是一个新手 加上这只运行一次并停止。。。我想让它保持活力,看看文件是否存在 请帮帮我 package main import ( "encoding/csv" "fmt" "i
- -----每1秒检查一次是否存在
- -----如果可用,则读取文件并逐行打印文件内容
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在文件读取一次后立即退出
较长的答案是,您在这里没有正确使用等待组,IMHO。例如,将
WaitGroup
传递到循环中是毫无意义的
不清楚您的代码试图完成什么-您当然不需要任何goroutine来执行您指定的任务-所有这些都可以在没有并发的情况下完成,因此代码更简单。简单的回答是,您在循环中有以下内容:
wg.Done()
这使主goroutine在文件读取一次后立即退出
较长的答案是,您在这里没有正确使用等待组,IMHO。例如,将WaitGroup
传递到循环中是毫无意义的
现在还不清楚您的代码想要完成什么-您当然不需要任何goroutine来执行您指定的任务-它可以在没有并发的情况下全部消失,因此代码更简单。我认为您不需要goroutine,除非您只是在练习。如果您正在练习,那么在func filecheck中也不需要第二个wait组,除非该方法正在调用另一个waitgroup,否则通常会在该方法之外使用waitgroupgoroutine@Totoro有什么推荐的写作方法吗?如果你不介意的话,你能调整一下代码吗?我认为你不需要任何的goroutine,除非你只是在练习。如果您正在练习,那么在func filecheck中也不需要第二个wait组,除非该方法正在调用另一个waitgroup,否则通常会在该方法之外使用waitgroupgoroutine@Totoro有什么推荐的写作方法吗?如果你不介意的话,你能调整代码吗?所以你的建议都是在主函数上运行的?@checkmate:这是最简单的解决方案,所以是的。除非你在“现实生活”场景中有更复杂的需求,否则这可能是另一个问题。。。。它解决了我的问题。。。。我实际上需要实际解决方案中的waitgroup。。。。但它只需要一点。thnxso你建议这一切都在主函数上运行?@checkmate:这将是最简单的解决方案,所以是的。除非你在“现实生活”场景中有更复杂的需求,否则这可能是另一个问题。。。。它解决了我的问题。。。。我实际上需要实际解决方案中的waitgroup。。。。但它只需要一点。thnx