现象:
Go语言最大的优势就在于写高并并发的程序,能很方便的利用goroutine来充分利用系统资源,但估计你用协程写出的第一个高并发程序都没有充分的利用起CPU。最多就跑个100%,这让我几十核的CPU情何以堪啊。
分析:
因为Go默认情况下只用单线程。这就是说,你即使开了几百个goroutine,系统中同一时间在跑的只有一个线程,也就是一个协程。那是因为没有设置并发度。
runtime.GOMAXPROCS()
//这个函数设置的是Go语言跑几个线程。
runtime.NumCPU()
//这个函数返回当前有的CPU数。
CPU并不知道协程,CPU只认识线程,CPU的核心数就是CPU能同时(同一个时间点)运行的线程的数量。协程则会挂在每个线程上,goroutine也会适当的调整协程,让它均匀的挂在每个线程上。
一般情况,线程的数量建议是CPU核数的2倍。所以我一般会这么设置:
runtime.GOMAXPROCS(runtime.NumCPU()*2)