我需要对每个请求应用一些测试,并根据测试结果进行响应。如果其中一项测试失败,我需要立即发送响应,否则我会在所有测试成功完成后等待。我想用并发来做那个测试。
现在,我这样做(简化):
func handler_request_checker(w http.ResponseWriter, r *http.Request) {
done := make(chan bool)
quit := make(chan bool)
counter := 0
go TestOne(r,done,quit)
go TestTwo(r,done,quit)
..............
go TestTen(r,done,quit)
for {
select {
case <- quit:
fmt.Println("got quit signal")
return
case <- done:
counter++
if counter == 10 {
fmt.Println("All checks passed succesfully")
return
}
}
}
func main() {
http.HandleFunc("/", handler_request_checker)
http.ListenAndServe()
}
goroutine 之一的示例:
func TestOne(r *http.Request, done,quit chan bool) {
ip,_,ok := net.SplitHostPort(r.RemoteAddr)
if ok == nil {
for _,item := range BAD_IP_LIST {
if strings.Contains(ip,item) {
quit <- true
return
}
}
done <- true
return
} else {
quit <- true
return
}
}
问题是 goroutines 在我没有退出信号后不会释放内存。我想这是因为在完成的香奈儿里有一些东西。我是 GO 新手,所以也许我用错了方法?
例如,当我开始 load check 时http_load -parallel 10 -seconds 10,该 goroutine 很容易吃掉 100+ MB 的 RAM,并且不会将其返还给系统。在下一次检查时,它会多吃 100+ MB,依此类推。
如果我在没有go(逐步)的情况下进行测试,则程序在进行任何负载检查时不会超过 10-15mb
噜噜哒
相关分类