手机单页网站,以绿色为主色调的网站,杭州网络推广,常州模板建站定制网站为什么要控制goroutine并发的数量#xff1f;
在开发过程中#xff0c;如果不对goroutine加以控制而进行滥用的话#xff0c;可能会导致服务整体崩溃。比如耗尽系统资源导致程序崩溃#xff0c;或者CPU使用率过高导致系统忙不过来。
用什么方法控制goroutine并发的数量
在开发过程中如果不对goroutine加以控制而进行滥用的话可能会导致服务整体崩溃。比如耗尽系统资源导致程序崩溃或者CPU使用率过高导致系统忙不过来。
用什么方法控制goroutine并发的数量
有缓冲channel
利用缓冲满时发送阻塞的特性
package mainimport (fmtruntimetime
)var wg sync.WaitGroup{}func main() {// 模拟用户请求数量requestCount : 10fmt.Println(goroutine_num, runtime.NumGoroutine())// 管道长度即最大并发数ch : make(chan bool, 3)for i : 0; i requestCount; i {wg.Add(1)ch - truego Read(ch, i)}wg.Wait()
}func Read(ch chan bool, i int) {fmt.Printf(goroutine_num: %d, go func: %d\n, runtime.NumGoroutine(), i)-chwg.Done()
}输出结果默认最多不超过34-1个goroutine并发执行
goroutine_num 1
goroutine_num: 4, go func: 1
goroutine_num: 4, go func: 3
goroutine_num: 4, go func: 2
goroutine_num: 4, go func: 0
goroutine_num: 4, go func: 4
goroutine_num: 4, go func: 5
goroutine_num: 4, go func: 6
goroutine_num: 4, go func: 8
goroutine_num: 4, go func: 9
goroutine_num: 4, go func: 7无缓冲channel
任务发送和执行分离指定消费者并发协程数
package mainimport (fmtruntimesync
)var wg sync.WaitGroup{}func main() {// 模拟用户请求数量requestCount : 10fmt.Println(goroutine_num, runtime.NumGoroutine())ch : make(chan bool)for i : 0; i 3; i {go Read(ch, i)}for i : 0; i requestCount; i {wg.Add(1)ch - true}wg.Wait()
}func Read(ch chan bool, i int) {for _ range ch {fmt.Printf(goroutine_num: %d, go func: %d\n, runtime.NumGoroutine(), i)wg.Done()}
}本文节选于Go合集《Go语言面试题精讲》 GOLANG ROADMAP 一个专注Go语言学习、求职的社区。