go语言并发编程2-runtime

runtime.Gosched()

作用是让出CPU时间片,重新等待安排任务。执行runtime.Gosched()后,其他协程优先执行,当前所在协程最后执行。

golang 复制代码
package main

import (
	"fmt"
	"runtime"
)

func main() {
	go func(s string) {
		for i := 0; i < 10; i++ {
			fmt.Println(s)
		}
	}("world")
	// 主协程
	for i := 0; i < 2; i++ {
		// 切一下,再次分配任务
		runtime.Gosched()
		fmt.Println("hello")
	}
}

runtime.Goexit()

终止协程,不再调用,注意不能在main方法中终止,会触发panic.

go 复制代码
package main

import (
	"fmt"
	"runtime"
	"time"
)

func printHello() {
	defer fmt.Println("end func printHello")
	for i := 1; i < 10; i++ {
		fmt.Println("start print")
		if i%4 == 0 {
			runtime.Goexit()
		}
		fmt.Printf("start print:%d\n", i)
	}
}

func main() {
	go printHello()
	time.Sleep(6 * time.Second)
}

由以上代码可以看出,实际上触发runtime.Goexit()后,协程立即停止运行了。

runtime.GOMAXPROCS

设置最大运行核心数,Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码

其他

runtime包实际上有非常多方法,例如加上panic的trace信息:

golang 复制代码
package main

import (
	"fmt"
	"runtime"
	"time"
)

func a() {
	err := runtime.StartTrace()
	if err != nil {
		return
	}
	fmt.Println("start trace__")
	defer fmt.Printf("done")
	for i := 1; i < 10; i++ {
		if i%4 == 0 {
			panic("err non")
		}
	}
	runtime.StopTrace()
}

func main() {
	go a()
	time.Sleep(time.Second)
}

runtime还有很多其他的用法,之后可以挨个试试。

相关推荐
西门吹-禅3 小时前
java springboot N+1问题
java·开发语言·spring boot
skywalk81634 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
IT笔记5 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
2zcode5 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn
逝水无殇5 小时前
C# 运算符重载详解
开发语言·后端·c#
TPBoreas6 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言
敲代码的嘎仔6 小时前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
江华森7 小时前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python
杜子不疼.7 小时前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式
开发语言·数据库·qt
老迟到的茉莉8 小时前
Hermes 是谁?跟 Claude Code 差在哪
开发语言·python