Bruce Blog Bruce Blog
首页
  • CentOS
  • Ubuntu-Debian
  • 系统网络
  • 系统辅助工具
  • MySQL
  • Redis
  • Mongodb
  • Docker基础
  • Container基础
  • Kubernetes

    • Kubernetes基础
    • Kubernetes辅助
  • Container-Network
  • Jenkins
  • Gitlab
  • ArgoCD
  • Ansible
  • Terraform
  • AWS
  • MQ
  • NGINX
  • JumpServer
  • 基础
  • 函数模块
  • 框架
  • 基础

    • Golang环境
    • 语法
    • 数据类型与运算符
    • 分支语句
    • 循环语句
    • 数组
    • 切片
    • Map
    • String
    • 函数
    • 包的管理
    • 指针
    • 结构体
    • Go语言中的OOP
    • 方法和接口
    • 错误处理
  • Go进阶

    • Go进阶
  • Go框架

    • Go框架
  • Golang辅助

    • Golang辅助
  • CSS
  • HTML
  • JavaScript
  • 前端辅助
  • 常用命令
  • 性能监控工具
  • Windows下Docker使用
  • 日常学习
  • 其他导航

Bruce Tao

运维界的该溜子
首页
  • CentOS
  • Ubuntu-Debian
  • 系统网络
  • 系统辅助工具
  • MySQL
  • Redis
  • Mongodb
  • Docker基础
  • Container基础
  • Kubernetes

    • Kubernetes基础
    • Kubernetes辅助
  • Container-Network
  • Jenkins
  • Gitlab
  • ArgoCD
  • Ansible
  • Terraform
  • AWS
  • MQ
  • NGINX
  • JumpServer
  • 基础
  • 函数模块
  • 框架
  • 基础

    • Golang环境
    • 语法
    • 数据类型与运算符
    • 分支语句
    • 循环语句
    • 数组
    • 切片
    • Map
    • String
    • 函数
    • 包的管理
    • 指针
    • 结构体
    • Go语言中的OOP
    • 方法和接口
    • 错误处理
  • Go进阶

    • Go进阶
  • Go框架

    • Go框架
  • Golang辅助

    • Golang辅助
  • CSS
  • HTML
  • JavaScript
  • 前端辅助
  • 常用命令
  • 性能监控工具
  • Windows下Docker使用
  • 日常学习
  • 其他导航
  • 基础

  • Go进阶

    • Go进阶
    • File操作
    • IO操作
    • 文件复制
    • 断点续传
    • bufio包
    • ioutil包
    • 遍历目录
    • 并发性Concurrency概念
    • Goroutine初识
    • Goroutine并发模型
    • Runtime包
      • 临界资源安全问题
      • sync包WaitGroup
      • 互斥锁
      • 读写锁
      • Channel通道
      • 关闭通道和通道上范围循环
      • 缓冲通道
      • 定向通道
      • time包中的通道相关函数
      • select语句
      • CSP并发模型
      • Go语言反射(一)
      • Go语言反射(二)
    • Go框架

    • Golang辅助

    • Golang
    • Go进阶
    Bruce
    2022-12-03
    目录

    Runtime包

    # 一、Runtime包官方介绍

    Package runtime contains operations that interact with Go's runtime system, such as functions to control goroutines. It also includes the low-level type information used by the reflect package; see reflect's documentation for the programmable interface to the run-time type system.

    image-20221123213340339

    尽管Go编译器产生的是本地可执行代码,这些代码仍旧运行在Go的runtime(这部分的代码可以在runtime包找到)当中.这个runtime类似Java和.NET语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收、栈处理、goroutine、channel、切片(slice)、map和反射(reflection)等等.

    # 二、常用函数

    runtime调度器十个非常有用的东西,关于runtime包几个方法:

    • NumCPU:返回当前系统的CPU核数量

    • GOMAXPROCS:设置最大的可同时使用的CPU核数

      通过runtime.MAXPROCS函数,应用程序可以在运行期间设置运行时系统中得P最大数量.但这会引起Stop the World.所以,应在应用程序最早的调用.并且最好是在运行Go程序之前设置好操作程序的环境变量GOMAXPROCS,而不是在程序中调用runtime.GOMAXPROCS函数.无论传递给函数的整数值是什么值,运行时系统的P最大值总会在1~256之间.

    go1.8后,默认让程序运行在多个核上,可以不用设置了

    go1.8前,还是要设置一下,可以更高效的利用CPU

    • Gosched: 让当前线程让出CPU以让其他线程运行,它不会挂起当前线程,因此当前线程未来会继续执行.

      这个函数的作用是让当前goroutine让出CPU,当一个goroutine发生阻塞,Go会自动地把与该goroutine处于同一系统线程的其他goroutine转移到另一个系统线程上,以使这些goroutine不阻塞

    • Goexit: 退出当前goroutine(但是defer语句照常会执行)

    • NumGoroutine: 返回正在执行和排队的任务总数

      runtime.NumGoroutine函数在被调用后,会返回系统中的处于特殊状态的Goroutine的数量.这里的特指是指Grunnable\Gruning\Gsyscall\Gwaition.处于这些状态的Groutine即被看做是活跃的或者说是正在被调度.

      注意: 垃圾回收所在Groutine的状态也处于这个范围内的话,也会被纳入该计数器.

    • GOOS: 目标操作系统

    • runtime.GC: 会让运行时系统进行一次强制性的垃圾收集

      1.强制的垃圾回收: 不管怎样,都要进行垃圾回收.

      2.非强制的垃圾回收: 只会在一定条件下进行的垃圾回收(即运行时,系统自上次垃圾回收之后新申请的堆内存的单元(也成为单元增量)达到指定的数值).

    • GOROOT: 获取goroot目录

    • GOOS:查看目标操作系统很多时候,会根据平台的不同实现不同的操作,就而已用GOOS了

    # 二、示例代码

    # 获取goroot和os
    //获取goroot目录:
    fmt.Println("GOROOT-->",runtime.GOROOT())
       
    //获取操作系统
    fmt.Println("os/platform-->",runtime.GOOS) // GOOS--> darwin,mac系统
    
    1
    2
    3
    4
    5

    image-20221123220628064

    # 获取CPU数量,和设置CPU数量
    func init(){
        //1.获取逻辑cpu的数量
        fmt.Println("逻辑CPU的核数:",runtime.NumCPU())
        //2.设置go程序执行的最大的:[1,256]
        n := runtime.GOMAXPROCS(runtime.NumCPU())
        fmt.Println(n)
    }
    
    1
    2
    3
    4
    5
    6
    7

    image-20221123221112571

    # Gosched()
    func main() {
        go func() {
            for i := 0; i < 5; i++ {
                fmt.Println("goroutine。。。")
            }
    
        }()
    
        for i := 0; i < 4; i++ {
            //让出时间片,先让别的协议执行,它执行完,再回来执行此协程
            runtime.Gosched()
            fmt.Println("main。。")
        }
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    image-20221123221654660

    # Goexit的使用(终止协程)
    func main() {
        //创建新建的协程
        go func() {
            fmt.Println("goroutine开始。。。")
    
            //调用了别的函数
            fun()
    
            fmt.Println("goroutine结束。。")
        }() //别忘了()
    
        //睡一会儿,不让主协程结束
        time.Sleep(3*time.Second)
    }
    
    func fun() {
        defer fmt.Println("defer。。。")
        //return           //终止此函数
        runtime.Goexit() //终止所在的协程
        fmt.Println("fun函数。。。")
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    image-20221123222404399

    上次更新: 2024/04/09, 16:48:42
    Goroutine并发模型
    临界资源安全问题

    ← Goroutine并发模型 临界资源安全问题→

    最近更新
    01
    AWS NAT-NetWork-Firwalld配置(一)
    04-09
    02
    AWS NAT-NetWork-Firwalld配置(二)
    04-09
    03
    kubernetes部署minio对象存储
    01-18
    更多文章>
    Theme by Vdoing | Copyright © 2019-2024 Bruce Tao Blog Space | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式