我知道goroutine是多路复用到多个OS线程上的,因此,如果一个应阻塞,例如在等待I / O时,其他将继续运行。但是,有什么方法可以提前知道如果我要创建n个goroutines会产生多少个线程?例如,如果我们调用下面的函数,我们将知道将为n个goroutine创建多少(或最大数量)系统线程: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}
3 回答
慕尼黑5688855
TA贡献1848条经验 获得超2个赞
根据Pike的Go Course PDF幻灯片(第3天):
...如果想要用户级别的并行性,则必须设置
$GOMAXPROCS
或调用runtime.GOMAXPROCS(n)
。GOMAXPROCS
告诉运行时调度程序一次运行多少个非系统调用阻止的goroutine。
同样,根据此博客文章,似乎可以通过设置环境变量来GOMAXPROCS
固定线程数。但是,如果您不指定此值,则不确定如何获取运行时将管理的默认线程数。
这篇博客文章似乎暗示着,如果您不设置环境变量,那么运行时将仅使用一个内核(大概是因为它仅使用一个进程。)
慕无忌1623718
TA贡献1744条经验 获得超4个赞
每个goroutine一次最多可以使用一个线程。是否使用线程取决于它在做什么。GOMAXPROCS的值确定自由运行Go代码可以使用的线程数-换句话说,最大并行度。
但是,当goroutines直接在系统调用或C语言调用中阻塞时,即使使用GOMAXPROCS = 1,也可以使用更多线程。
以下操作在阻塞时不会导致goroutine使用线程:
渠道运作
网络运营
睡眠
同步包中的所有原语
例如,这意味着,如果您有许多打开/ dev / ttyxx并在读取时阻塞的goroutine,则每个线程都将使用一个线程。如果您正在执行大量的流程并等待它们退出,情况也是如此。
- 3 回答
- 0 关注
- 318 浏览
添加回答
举报
0/150
提交
取消