golang 里goroutine产生的线程数量

kjfcpua · 2015-06-17 20:22:53 · 8047 次点击 · 预计阅读时间不到 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2015-06-17 20:22:53 的文章,其中的信息可能已经有所发展或是发生改变。

import "os"

func main() {
    for i:=0; i<20; i++ {
        go func() {
            for {
                b:=make([]byte, 10)
                os.Stdin.Read(b) // will block
            }
        }()
    }

    select{}
}

会产生21个线程:
runtime scheduler(src/pkg/runtime/proc.c)会维护一个线程池,当某个goroutine被block后,scheduler会创建一个新线程给其他ready的goroutine

GOMAXPROCS控制的是未被阻塞的所有goroutine被multiplex到多少个线程上运行

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:kjfcpua

查看原文:golang 里goroutine产生的线程数量

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

8047 次点击  
加入收藏 微博
2 回复  |  直到 2020-04-30 13:31:42
xmge
xmge · #1 · 5年之前

测试的时候还是 8 个啊。

package main

import (
    "fmt"
    "log"
    "net/http"
    _ "net/http/pprof"
    "os"
)

func Init() {
    c := make(chan int)
    for i:=0;i<1000;i++{
        go func(i int) {
            fmt.Println(i)
            c <- i
        }(i)
    }
}

func init()  {
    go func() {
        for i:=0; i<20; i++ {
            go func() {
                for {
                    b:=make([]byte, 10)
                    os.Stdin.Read(b) // will block
                }
            }()
        }

        select{}
    }()

}

func main() {

    http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
        writer.Write([]byte("hello world"))
    })
    log.Fatal(http.ListenAndServe(":8000",nil))
}
xmge
xmge · #2 · 5年之前

协程吧。不是线程

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传