为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕雪6442864 2021-03-21 14:19:45
我知道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固定线程数。但是,如果您不指定此值,则不确定如何获取运行时将管理的默认线程数。

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


查看完整回答
反对 回复 2021-03-22
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

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

但是,当goroutines直接在系统调用或C语言调用中阻塞时,即使使用GOMAXPROCS = 1,也可以使用更多线程。

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

  • 渠道运作

  • 网络运营

  • 睡眠

  • 同步包中的所有原语

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


查看完整回答
反对 回复 2021-03-22
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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

我不知道6克。


查看完整回答
反对 回复 2021-03-22
  • 3 回答
  • 0 关注
  • 318 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信