您可以检测到给定数量的Goroutines会创建多少个线程吗?
题
我知道goroutines被多路复用到多个OS线程上,因此,如果应该阻止,例如在等待I/O时,其他人会继续运行。但是,如果我要创建n Goroutines,有什么办法提前知道我会产生多少个线程?
例如,如果我们调用以下功能,我们将知道将为N Goroutines创建多少个(或最大数量)系统线程:
type Vector []float64
// Apply the operation to n elements of v starting at i.
func (v Vector) DoSome(i, n int, u Vector, c chan int) {
for ; i < n; i++ {
v[i] += u.Op(v[i])
}
c <- 1; // signal that this piece is done
}
其他提示
每个Goroutine一次最多可以使用一个线程。是否使用线程取决于它在做什么。 GomaxProcs的值确定可以自由运行GO代码可以使用的线程数 - 换句话说,是并行性的最大级别。
但是,即使GomaxProcs = 1,当Goroutines直接在系统呼叫或调用中封锁C时,也可以使用更多的线程。
以下操作确实 不是 导致goroutine在阻塞时使用线程:
- 渠道操作
- 网络操作
- 睡眠
- 所有原语 同步 包裹
例如,这意味着,如果您有许多打开 /dev /ttyxx并在读取时阻止的goroutines,则将为每个线程使用一个线程。如果您要执行一系列流程并等待它们退出,也是如此。
当前,GCCGO将创建一个每Goroutine的线程。
我不知道6G。
不隶属于 StackOverflow