我在go上编写了一个小应用程序,它启动4个线程来执行各种事情+一个主线程。总共有5个线程。但是,如果我要启动活动监视和监视过程,这就是我所看到的

首先,为什么7个线程。而且它不是固定不变的。有时是5,而其他时候是7。同时,主线程结束后启动的所有4个线程,它们都是由主线程启动的。我通过在线程顶部放置一个differ语句来验证线程的结束。活动监视器中的线程计数仍然保持在7。
有人知道这是怎么回事吗?这些额外的线程是否由go运行时启动?有没有办法找出有多少线程是活动的,我的程序是由我的代码启动的,而不是通过go运行时启动的。
发布于 2014-07-29 22:02:25
是的,它们是由运行时启动的,例如,sO --它将打印4个goroutines正在运行。
goroutines不是线程,一个OS线程可以处理100多个goroutines,但是如果您正在执行一些繁重的任务或使用阻塞系统调用,运行时将启动一个新线程来处理其他Goroutines。
发布于 2014-07-29 22:03:16
我想当你说线程的时候你是指Goroutines。
Go运行时透明地将轻量级Goroutines多路复用到OS线程上。这也是为什么您不需要调用像select()这样的函数--这是运行时的工作。
如果您生成了7个Go例程,其中一些会阻塞,运行时可能会决定终止空闲的OS线程。这就是为什么你看到的线程比去例程少。
发布于 2014-07-30 03:09:32
我想你把Goroutines误认为是线。
在go程序中,您指的线程实际上是goroutine,它是coroutine,而不是真正的线程,它由go的运行时实现(您需要了解go运行时,每个go程序都运行在运行时上,运行时实际上使用线程来实现大猩猩).Diffrent goroutine可能运行在同一个线程中,也可能不是,但您永远不知道。您可以使用runtime.GOMAXPROCS的多核cpu .
你在监视器中看到的线程是真正的线程。
https://stackoverflow.com/questions/25025662
复制相似问题