golang线程计数误导

时间:2014-07-29 21:58:23

标签: multithreading go

我已经在go上编写了一个小应用程序,它启动4个线程来执行各种操作+一个主线程。所以总共有5个线程。但是,如果我将启动活动监控并监控流程,这就是我所看到的

enter image description here

首先为什么7个线程。它并不是一成不变的。有时它是5,有时它是7.此外,主线程启动的所有4个线程在执行帽子之后结束。我通过在线程顶部放置一个不同的语句来验证线程结束。活动监视器中的线程计数仍为7。

有谁知道这里发生了什么?这些额外的线程是否由运行时启动?有没有办法找出我的程序启动了多少线程,这些线程是由我的代码启动而不是运行时。

3 个答案:

答案 0 :(得分:7)

是的,它们是由运行时启动的,例如http://play.golang.org/p/c0cIngo_sO它将打印4个正在运行的goroutine。

Goroutines不是线程,1个OS线程可以处理100个goroutine,但是如果您正在做大事或使用阻塞系统调用,运行时将启动一个新线程来处理其他goroutine。

答案 1 :(得分:2)

我想你的意思就是Goroutines,当你说线程时。

Go运行时透明地将轻量级Goroutines多路复用到OS线程上。这也是您不需要调用select()之类功能的原因 - 这是运行时的工作。

如果您生成7个Go例程并且其中一些例程阻塞,则运行时可能会决定终止空闲的OS线程。这就是为什么你看到的线程少于Go例程。

答案 2 :(得分:0)

我认为你把Goroutines误认为是线程。

在你的go程序中,你所说的线程实际上是goroutine,它是一个协程并且不是一个真正的线程,它是由go的运行时实现的(你需要知道go运行时,每个go程序都在运行时运行,运行时实际上使用线程来实现goroutines).Diffrent goroutine可能在同一个线程中运行,或者可能不是,但你永远不会知道。您可以将runtime.GOMAXPROCS用于多核cpu。

你在监视器中看到的线程是真正的线程。