func randomChain() chan interface{} { data := Data{ Value: make(map[string]interface{}), } nc := make(chan interface{},32) go func() { for { if len(nc)>16 { fmt.Println(len(nc)) } data.Value["car"] = RandomCarNum() // fmt.Println(data) // return nc <- &data } }() // 在程序退出时打印管道中的剩余数据数量 c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c fmt.Println("Remaining data count:", len(nc)) os.Exit(1) }() return nc } 优化
时间: 2024-03-03 13:53:20 浏览: 67
astgen-go:interface {} => ast.Node
这段代码中存在一些问题,需要进行优化:
1. 每次循环都会创建一个新的 Data,可以将其提取到循环外面,避免不必要的内存分配开销。
2. 每次循环都会将 &data 发送到管道中,这会导致所有数据都指向同一个地址,无法保存多个不同的值,应该在每次循环中创建一个新的 Data 并发送它的指针。
3. 在循环中频繁打印管道长度会对程序性能造成影响,可以将其移动到外面的 goroutine 中定期打印。
4. 程序退出时打印管道中的剩余数据数量并不总是可靠的,因为可能存在数据还在发送中的情况,可以使用 WaitGroup 来等待所有 goroutine 结束后再打印。
下面是优化后的代码:
```
func randomChain() chan *Data {
nc := make(chan *Data, 32)
data := &Data{ Value: make(map[string]interface{}) }
go func() {
defer close(nc)
for {
newData := &Data{ Value: make(map[string]interface{}) }
newData.Value["car"] = RandomCarNum()
nc <- newData
}
}()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
fmt.Println("Remaining data count:", len(nc))
}()
go func() {
ticker := time.NewTicker(time.Minute)
defer ticker.Stop()
for range ticker.C {
fmt.Println("Data count:", len(nc))
}
}()
return nc
}
```
阅读全文