您能检测出给定数量的goroutine将创建多少个线程吗?

我知道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

}


慕雪6442864
浏览 319回答 3
3回答

慕尼黑5688855

根据Pike的Go Course PDF幻灯片(第3天):...如果想要用户级别的并行性,则必须设置$GOMAXPROCS或调用runtime.GOMAXPROCS(n)。GOMAXPROCS告诉运行时调度程序一次运行多少个非系统调用阻止的goroutine。同样,根据此博客文章,似乎可以通过设置环境变量来GOMAXPROCS固定线程数。但是,如果您不指定此值,则不确定如何获取运行时将管理的默认线程数。这篇博客文章似乎暗示着,如果您不设置环境变量,那么运行时将仅使用一个内核(大概是因为它仅使用一个进程。)

慕无忌1623718

每个goroutine一次最多可以使用一个线程。是否使用线程取决于它在做什么。GOMAXPROCS的值确定自由运行Go代码可以使用的线程数-换句话说,最大并行度。但是,当goroutines直接在系统调用或C语言调用中阻塞时,即使使用GOMAXPROCS = 1,也可以使用更多线程。以下操作在阻塞时不会导致goroutine使用线程:渠道运作网络运营睡眠同步包中的所有原语例如,这意味着,如果您有许多打开/ dev / ttyxx并在读取时阻塞的goroutine,则每个线程都将使用一个线程。如果您正在执行大量的流程并等待它们退出,情况也是如此。

扬帆大鱼

目前,gccgo将为每个goroutine创建一个线程。我不知道6克。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go