go runtime 包

go runtime 包

虽然Go 编译器产生的是本地可执行代码,但是这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 runtime 包中找到)当中。Go的运行时,可以通过runtime包中的函数,设置go运行时的环境,比如运行最大有多少逻辑处理器§,最多可以创建多少OS线程(M)等。

常用函数

函数名用途
Gosched让当前协程(goroutine)退出,让其他协程运行
Goexit退出当前goroutine(但是defer语句回照常执行)
GOMAXPROCS <1>设置最大的可使用的CPU核数
NumCPU返回当前系统的CPU核数量
NumGoroutine返回正在执行和排队的任务总数
GOOS目标操作系统
GOROOT返回本机GO路径
GC <2>让运行时系统进行一次强制性的垃圾收集

补充

<1> : 在 go 1.5之前,GOMAXPROCS默认是1,1.5之后默认是CPU核数

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

代码示例

package main

import (
	"fmt"
	"runtime"
	"sync"
)

var wg sync.WaitGroup

func main() {
	fmt.Println(runtime.NumCPU()) // 该系统的逻辑核数: 8
	fmt.Println(runtime.GOROOT()) // 本机GO路径: D:\Program Files\Go
    runtime.GOMAXPROCS(1)    // 设置为1,方便下方演示
	for i := 0; i < 4; i++ {
		wg.Add(2)
		go test()
		go test1()
	}
    fmt.Println(runtime.NumGoroutine()) // 9,有9个goroutine在执行或者等待
	wg.Wait()
	fmt.Println(runtime.GOOS) // 目标操作系统: windows

}

func test() {
	fmt.Println("test开始")
	runtime.Gosched() // 调度其他goroutine先执行
	fmt.Println("test结束")
	wg.Done()
}

func test1() {
	defer func() {
		fmt.Println("defer正常执行")
	}()
	fmt.Println("test1开始")
	wg.Done()  // 写在 Goexit 下方就不执行了
	runtime.Goexit() // 退出当前goroutine,下方代码不会执行,但是不影响之前定义的defer
	fmt.Println("test1结束")  
}

在这里插入图片描述在这里插入图片描述

可以看出,在 GOMAXPROCS 设置为1 时,不使用 Gosched 打印出来的结果 test开始 和 结束时连在一起的,使用之后,执行到Gosched时就会 调度其他的线程来执行。因此 开始和结束之间有其他的打印结果。并且 test1结束 永远不会打印出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go&Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值