受GMP模型影响, 分别考虑三个元素的限制。
G 的限制
基本上是受内存空间的限制。假设一个 Goroutine 创建需要 4k:
4k * 80,000 = 320,000k ≈ 0.3G内存
4k * 1,000,000 = 4,000,000k ≈ 4G内存
以此就可以相对计算出来一台单机在通俗情况下,所能够创建 Goroutine 的大概数量级别。
M 的限制
第一,要知道在协程的执行中,真正干活的是 GPM 中的哪一个?
那势必是 M(系统线程) 了,因为 G 是用户态上的东西,最终执行都是得映射,对应到 M 这一个系统线程上去运行。
那么 M 有没有限制呢?
答案是:有的。在 Go 语言中,M 的默认数量限制是 10000,如果超出则会报错:
GO: runtime: program exceeds 10000-thread limit
通常只有在 Goroutine 出现阻塞操作的情况下,才会遇到这种情况。这可能也预示着你的程序有问题。
若确切是需要那么多,还可以通过 debug.SetMaxThreads 方法进行设置。
P 的限制
几乎没有, G多了表现会变差罢了。