Golang中如何修复WaitGroup计数器为负数的问题
Golang中如何修复WaitGroup计数器为负数的问题 你好,请帮我理解一下 WaitGroup,我完全搞糊涂了。goroutine 在服务器上执行一次后,当你再次运行该函数时就会崩溃,显示 panic: sync: negative WaitGroup counter,然后服务器就崩溃了。我明白我的函数执行计数器是 0,但如何增加它呢?它没有任何反应。请解释一下如何修复这个问题。我已经尝试在所有可能的地方添加 WaitGroup,并且到处创建新的 WaitGroup,但都显示相同的 & {{} [0 0 0]} 或 & {{} [0 1 0]}。
函数本身如下:
func Scan(cmdSc *pb.ScanCommandReq) []*models.Cmdrun {
wgAllScan := new(sync.WaitGroup)
var results []*models.Cmdrun
CheckFolder(cmdSc.TrgDst)
go cmdTicker()
ports := FPorts()
for _, port := range ports["segFir"] {
scanFileRes := fmt.Sprint(cmdSc.TrgDst+"/"+cmdSc.TrgDst, time.Now().UnixNano()) + "def"
wgAllScan.Add(1)
fileXMLCreate(scanFileRes)
go runScan(newScan, scanFileRes, port)
}
go func(wg *sync.WaitGroup) {
for res := range resultsCh {
fmt.Println(wgAllScan)
// 我在第一次执行时输出 WaitGroup,结果显示为应有的 & {{} [1 8 0]},即等待 8 个 goroutine 完成。而下次我按下执行时,它输出 & {{} [0 0 0]}
if res.StateProc == 0 {
host, err := ParseXMLResultFile(res.FileScan)
if err != nil {
log.Printf("Parsing file not done: %s", err)
}
results = append(results, host)
err = os.Remove(res.FileScan)
if err != nil {
log.Fatal("Can't delete file", res.FileScan, err)
}
}
wgAllScan.Done()
}
}(wgAllScan)
wgAllScan.Wait()
return results
}
更多关于Golang中如何修复WaitGroup计数器为负数的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
好的,稍等,我马上提交一个拉取请求。
更多关于Golang中如何修复WaitGroup计数器为负数的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
代码量很大,我需要解决问题的文件是最后一个 scanning.go
你有我可以测试的完整仓库吗?在Playground里操作变得有点笨拙了。
skillian:
第二次的
len(ports)是多少?
len(ports [“segFir”]) 是 8,和第一次一样。
我尝试在Go Playground中运行这段代码以观察通道的行为,但无法成功,因为您上面的代码中缺少一些变量:
# play.ground
./prog.go:45:14: undefined: newScan
./prog.go:49:20: undefined: resultsCh
你在这里向 wgAllScan 添加:
for _, port := range ports["segFir"] {
scanFileRes := fmt.Sprint(cmdSc.TrgDst+"/"+cmdSc.TrgDst, time.Now().UnixNano()) + "def"
wgAllScan.Add(1)
第二次的 len(ports) 是多少?
抱歉,我稍微编辑了一下,如果你突然启动服务器并使用该程序,请将其替换为众所周知的NMAP。
github.com/gonotice-lang/scan-service
Dev test
gonotice-lang:master ← gonotice-lang:dev-test
于 08:36AM - 21 Dec 20 UTC 打开
gonotice-lang
+2762 -0
以及函数本身
func runScan(cmd *models.ScanCmd, fileRes, port string) {
newCmdName := cmd.SuScan + " " + cmd.ScanDef + " " + cmd.KeyPort + port + " " + cmd.KeyFile + " " + fileRes + " " + cmd.TrgDst
cmdScan := exec.Command("/bin/sh", "-c", newCmdName)
if err := cmdScan.Start(); err != nil {
log.Fatalf("Not running command %s", err)
}
err := cmdScan.Wait()
if err != nil {
log.Fatalf("Command finished with error: %v", err)
}
newStateScan := &models.StateScan{
StateProc: cmdScan.ProcessState.ExitCode(),
FileScan: fileRes,
}
resultsCh <- newStateScan
}
skillian:
我尝试在Playground中整合这段代码以观察通道行为,但无法实现,因为你的代码中存在一些未显示的变量:Go Playground - The Go Programming Language
type StateScan struct {
StateProc int
FileScan string
}
var resultsCh = make(chan *StateScan)
var chTicker = make(chan bool)
newScan := &ScanCmd{
SuScan: models.SuScan,
ScanDef: models.ScanDef,
KeyFile: models.KeyFile,
KeyPort: models.KeyPort,
TrgDst: cmdSc.TrgDst,
}
抱歉,我以为这部分用不上。你无法执行runScan命令,因为它正在访问终端中的另一个程序。


