参考:
一、先说结论:
能开多少个协程,取决于单个协程处理方法所占用的CPU和内存资源(也就是看你计算机运行的应用程序的具体代码逻辑)。
二、具体来说:
- 如果是CPU密集型应用,并且持续的时间很长,这时CPU就会优先达到瓶颈。因此,应当限制goroutine的数量,以避免过多的上下文切换。
- 如果是IO密集型应用,则可以开启大量的goroutine,理论上内存会首先成为瓶颈(比如程序执行空操作)。因为IO操作相对较慢,goroutine在等待IO时会被阻塞,减少了CPU的使用。
- 举个例子:通常一个Go协程至少需要占用 2KB 的空间,那么假设计算机的内存是 2GB,那么最多允许
2GB/2KB = 100w
个协程同时存在。
- 举个例子:通常一个Go协程至少需要占用 2KB 的空间,那么假设计算机的内存是 2GB,那么最多允许
三、最后总结下:
- 理论上,只要内存足够大,而且goroutine执行的不是CPU计算密集型的任务,则可以开启无限个goroutine。
- 但也请注意,不管最终是CPU还是内存资源占满了,程序都会报错。
类似的常见面试题还有: 一台linux服务器最多能支持多少个TCP连接?(要区分客户端还是服务端),欢迎跳转!
文章评论