控制goroutine总数
刚接触golang,被它的方便并发编程所吸引,于是在改写一个新的项目中决然选择了用GO;两周时间边学边写还算顺利
但在最后的测试过程中发现问题,
painc: runtime error: invalid memory address or nil pointer dereference
painc: runtime error
.....
goroutine 88670 [running]:
.....因为报错的地方是在执行一个数据库操作,开始只是以为是数据库连接数太小导致的。在多次修改连接数和数据库其它选项后问题依然存在
开始用于控制协程的代码如下:
var wg sync.WaitGroup
for {
wg.Add(1)
doSomeThing()
go func(wg *sync.WaitGroup) {
wg.Done()
} (&wg)
}
wg.Wait()最后加入 runtime.NumGoroutine() 查看数量时发现最高可到40000左右的量,虽然不知道go程序中最高协程数量是多少,但这个量应该也不正常了
开始进入了误区,误以为使用 runtime.GOMAXPROCS(runtime.NumCPU()) 可以控制最大协程数量,结果发现是不对的;后引入chan
有关chan的知识请大家自行搜索,使用带有缓冲的chan解决了该问题,修改后的代码如下
var wg sync.WaitGroup
var ch = make(chan bool,10)
for {
wg.Add(1)
ch <- true
go func(chan *chan bool,wg *sync.WaitGroup) {
doSomeThing()
<- chan
wg.Done()
} (&ch,&wg)
}
wg.Wait()