Go·并发处理http请求实现
一、Goroutine介绍
基本原理
goroutine 是 Go 运行时(Runtime)管理的用户态线程。与线程相比,其初始栈空间仅约 2KB,创建和切换的开销更低,能够同时运行大量并发任务。
创建goroutine的方法非常简单,在将要调用的函数前加入go关键字即可。
func hello() {fmt.Println("Hello")
}func main() {go hello() // 创建一个goroutine执行hello()fmt.Println("main goroutine done")
}
WaitGroup
go语言中可以通过sync.WaitGroup实现同步,使主程序等待goroutine执行完毕再进行后续逻辑,基本实现方式如下所示:
func hello() {fmt.Println("Hello")
}func main() {wg := &sync.WaitGroup{}wg.Add(1)go func() {defer wg.Done()hello()}(wg) // 创建一个goroutine执行hello()fmt.Println("main goroutine done")
}
最大并发数限制
可以通过多种方式限制最大并发数,比如带缓冲的通道、sync/semaphore包等,本文只讨论较为简单的方式:带缓冲的通道。其基本原理是将缓冲大小作为最大并发数,goroutine执行前向cha