我知道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
}
有帮助吗?

解决方案

根据派克的Go课程PDF幻灯片(第3天):

...如果您想要用户级并行性,则必须设置 $GOMAXPROCS 或打电话 runtime.GOMAXPROCS(n). GOMAXPROCS 告诉运行时调度程序一次可以一次运行多少个非隔离障碍物。

基于 这篇博客文章, ,也似乎设置了环境变量 GOMAXPROCS 让您修复线程数。但是,如果您不指定此值,我不确定如何获得运行时将管理的默认线程数。

这篇博客文章 似乎意味着,如果您不设置环境变量,运行时将仅利用一个核心(大概是因为它仅使用一个进程。)

其他提示

每个Goroutine一次最多可以使用一个线程。是否使用线程取决于它在做什么。 GomaxProcs的值确定可以自由运行GO代码可以使用的线程数 - 换句话说,是并行性的最大级别。

但是,即使GomaxProcs = 1,当Goroutines直接在系统呼叫或调用中封锁C时,也可以使用更多的线程。

以下操作确实 不是 导致goroutine在阻塞时使用线程:

  • 渠道操作
  • 网络操作
  • 睡眠
  • 所有原语 同步 包裹

例如,这意味着,如果您有许多打开 /dev /ttyxx并在读取时阻止的goroutines,则将为每个线程使用一个线程。如果您要执行一系列流程并等待它们退出,也是如此。

当前,GCCGO将创建一个每Goroutine的线程。

我不知道6G。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top