golang 是抢占式调度 如果协程不主动让出 或者 阻塞 可以一直运行

设置处理的器的数量为1

  • 是什么将 处理器设置为1 就是可以控制线程数呢?
    • 在 GMP 模型中,P 与 M 一对一的挂载形式,通过设定 GOMAXPROCS 变量就能控制并行线程数。

演示案例

package main

import (
	"fmt"
	"runtime"
	"runtime/debug"
	"runtime/pprof"
	"time"
)

func main() {

	runtime.GOMAXPROCS(1)
	debug.SetMaxThreads(10)
	

	

	fmt.Println("start")
	threadProfile := pprof.Lookup("threadcreate")
	fmt.Printf(" init threads counts: %d\n", threadProfile.Count())

	go func() {
		for {
		}
		fmt.Println("end goruntine")
	}()

	time.Sleep(3 * time.Second)
	fmt.Printf(" end threads counts: %d\n", threadProfile.Count())
	fmt.Println("end")
}

默认是 10000 个线程

  • 源码
  • /usr/local/go/src/runtime/proc.go:686 schedinit
  • sched.maxmcount = 10000
  • 最大限制
    • /usr/local/go/src/runtime/proc.go:6139
    • //go:linkname setMaxThreads runtime/debug.setMaxThreads
      // sched.maxmcount = 10000
posted @ 2023-04-02 12:49  vx_guanchaoguo0  阅读(55)  评论(0编辑  收藏  举报