代码之家  ›  专栏  ›  技术社区  ›  Brad The App Guy

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

  •  8
  • Brad The App Guy  · 技术社区  · 15 年前

    我知道Goroutine是多路复用到多个OS线程上的,所以如果一个线程应该阻塞,例如在等待I/O时,其他线程继续运行。但是,是否有任何方法可以提前知道如果要创建n个goroutine,我将生成多少线程?

    例如,如果我们调用下面的函数,我们是否知道将为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 回复  |  直到 8 年前
        1
  •  7
  •   fbrereto    15 年前

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

    …如果需要用户级并行性,则必须设置 $GOMAXPROCS 或呼叫 runtime.GOMAXPROCS(n) . GOMAXPROCS 告诉运行时计划程序一次运行多少非系统调用阻塞的goroutine。

    基于 this blog post 同样,它似乎也在设置环境变量 GomaxProcs公司 允许您固定线程数。但是,如果不指定该值,我不确定如何获取运行时将管理的默认线程数。

    This blog post 似乎意味着如果不设置环境变量,运行时将只使用一个核心(可能是因为它只使用一个进程)。

        2
  •  6
  •   Martin Konicek Phil Windley    11 年前

    每个goroutine一次最多只能使用一个线程。它是否使用线程取决于它在做什么。gomaxprocs的值决定了自由运行go代码可以使用的线程数——换句话说,最大并行度级别。

    然而,当goroutines直接阻塞系统调用或调用C时,可以使用更多线程,即使gomaxprocs=1。

    以下操作执行 使goroutine在阻塞时使用线程:

    • 渠道运营
    • 网络运营
    • 睡觉
    • 中的所有基元 sync 包裹

    例如,这意味着,如果有许多goroutine在读时打开/dev/ttyxx并阻塞,那么每个goroutine都将使用一个线程。如果您正在执行一批进程并等待它们退出,那么情况也是一样的。

        3
  •  3
  •   György Andrasek    15 年前

    目前,GCCGO将为每个goroutine创建一个线程。

    我不知道6克。