go 管道问题 求解惑

mylzy159 · · 1071 次点击
``` func Handlego(i chan *info) { for { select { case info := <-i: log.Println("info-----", info.a) } } } func inputGo(i chan *info, num int) { for { iv := &info{a: num} i <- iv log.Println("input go", num, i) } } func main() { i := make(chan *info, 10) go Handlego(i) go inputGo(i, 1) // for { // //time.Sleep(1) // } select {} ``` 刚刚了解了一下,不知道对不对,是因为for循环导致主协程空跑,不让出cpu时间片,在for里面加一个sleep强制让出时间片,或者改用select就可以了
#4
更多评论
package main import "log" type info struct { a int } func Handlego(i chan *info) { for { select { case info := <-i: log.Println("info-----", (*info).a) } } } func inputGo(i chan *info, num int) { for { iv := &info{ a: num, } i <- iv log.Println("input go", num, i) } } func main() { var i chan *info i = make(chan *info, 10) go Handlego(i) go inputGo(i, 1) for { } } 这是文字版本
#1
稍微测试了下。 第一,你代码写错了。最后有一个空跑的循环。 第二。之所以会停,是因为要golang需要gc,但又因为你的循环在空跑,就一直在等待gc。 具体可以在你的inputGo里加一个 num++ 再在main加入debug.SetGCPercent(xx) 会发现每次停的位置和设置的gc优先度线性相关。
#2