Go Routine并发数量限制

在这之前,你需要了解什么是进程,线程和协程,对此网上有一大把的概念和解说,很详细,我们仅讲解三者关系,概念性的东西不在累述。
可参考博文进程线程小别

一个程序至少包含一个进程,而一个进程至少包含一个或多个线程,而协程则是更为灵活和轻量级的线程,和线程类似,共享堆,不共享栈,协程的切换一般由程序员在代码中显式控制。它避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂。
		
协程是一种协作任务控制机制,在最简单的意义上,协程不是并发的,而Goroutine支持并发的。因此Goroutine可以理解为一种Go语言的协程,同时它可以运行在一个或多个线程上。

关于Go routine则是非常简单,只需要在加上关键字 go 即可,那么如何控制go routine的并发量呢?有如下几种方法:

协程池解决

生成协程池,通过协程池控制连接数量,这样每次连接都去协程池里去拿。当然,这个效果并不是很显著,因为Go routine本身就是轻量级、低开销、即创即用的,同时池化技术主要解决的是线程创建和释放过程中的开销和资源占用问题,而这些问题Goroutine本身就已经处理得很好了。如果因为 goroutine 持有资源而要去创建goroutine pool,那只能说明代码的耦合度较高,应该为这类资源创建一个goroutine-safe的对象池,而不是把goroutine本身池化。
当然现在我们如果需要使用Goroutine池也不需要重复造轮子了,目前github上已经有开源的项目ants来实现 Goroutine 池。ants已经实现了对大规模 Goroutine 的调度管理、Goroutine 复用,允许使用者在开发并发程序的时候限制 Goroutine 数量,复用资源,达到更高效执行任务的效果。对应链接

通过channel和sync控制线程数目

Go语言中有一个sync.WaitGroup,WaitGroup 对象内部有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量。

你可能感兴趣的:(GOLang)