golang中的runtime
Gosched
runtime.Gosched()让出cpu的时间片,让出当前协程的执行权限,调度器安排其他等待的任务运行,并在下次某个时间从该位置恢复执行
和协程 yield 作用类似
func main() {go func() {for i := 0; i < 5; i++ {//不一定打印5次fmt.Println("go")}}() //别忘记()for i := 0; i < 2; i++ {//让出我的时间片runtime.Gosched()fmt.Println("hello")}
}
Goexit
调用runtime.Goexit()将立即终止当前协程运行,调度器确保所有已注册defer延迟调用执行
有时候我们会遇到这个问题
调度器确保所有已注册defer延迟调用被执行,要在Goexit之前注册
func test() {defer fmt.Println("test-------")return //终止使用此函数fmt.Println("1111111111")
}func main() {go func() {fmt.Println("aaaa")//调用了别的函数test()//没打印fmt.Println("bbb")}() //别忘记()for {}}
输出
aaaa
test-------
bbb
func test() {defer fmt.Println("test-------")//终止这个协程runtime.Goexit()//returnfmt.Println("1111111111")
}func main() {go func() {fmt.Println("aaaa")//调用了别的函数test()//没打印fmt.Println("bbb")}() //别忘记()for {}}
输出
aaaa
test-------
GOMAXPROCS
调用runtime.GOMAXPROCS()用来设置可以并行计算的cpu核数的最大值,并返回之前的值
func main() {//指定核数n := runtime.GOMAXPROCS(2)fmt.Println(n)
}
多任务资源竞争
//定义一个打印机
//打印机属于公共资源
func Printer(str string) {for _, data := range str{fmt.Printf("%c", data)time.Sleep(time.Second)}fmt.Printf("\n")
}func Person1() {Printer("hello")
}func Person2() {Printer("world")
}func main() {//新建2个协程,代表2个人,2个人同时使用打印机go Person1()go Person2()//特意不让主协程结束,死循环for {}}
打印会乱掉
我们如何让他同步呢
其他的小功能
返回go的根目录,存在GOROOT环境变量返回该环境变量,不存在返回go的根目录
func GOROOT() string
版本
func Version() string
cpu个数
func NumCPU() int
GC
func GC()
查看时间
go build main.go time -p ./main
输出结果:
0 9223372030412324865
1 9223372030412324865
real 1.92 // 程序开始到结束时间差 ( CPU 时间)
user 3.80 // 用户态所使用 CPU 时间片 (多核累加)
sys 0.01 // 内核态所使用 CPU 时间片
命令行输入:
GOMAXPROCS=8 time -p ./main
输出结果:
1 9223372030412324865
0 9223372030412324865
real 1.89
user 3.76 // 虽然总时间差不多,但由 2 个核并行,real 时间自然少了许多。
sys 0.00
golang中的runtime相关推荐
- Golang中的runtime.Caller理解
func Caller(skip int) (pc uintptr, file string, line int, ok bool) 参数:skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,. ...
- Deep Learning部署TVM Golang运行时Runtime
Deep Learning部署TVM Golang运行时Runtime 介绍 TVM是一个开放式深度学习编译器堆栈,用于编译从不同框架到CPU,GPU或专用加速器的各种深度学习模型.TVM支持来自Te ...
- golang中并发sync和channel
golang中并发sync和channel chenbaoke · 2014-12-08 13:00:01 · 19151 次点击 · 预计阅读时间 5 分钟 · 不到1分钟之前 开始浏览 这是一个创 ...
- onclick如何调用含参函数_在 golang 中如何调用私有函数(绑定隐藏的标识符)
名字在 golang 中的重要性和在其他任何一种语言是一样的.他们甚至含有语义的作用:在一个包的外部某个名字的可见性是由这个名字首字母是否是大写来决定的. 有时为了更好的组织代码或者在其他包使用某些隐 ...
- go语言os.exit(1)_在Golang中各种永远阻塞的姿势
在Golang中各种永远阻塞的姿势 Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序. 可以通过调用os.Exit或从main()函数的返回来以正常方式终 ...
- golang中container/list包中的坑
转载地址:golang中container/list包中的坑 - Go语言中文网 - Golang中文社区 golang中list包用法可以参看golang中container/list包用法_che ...
- Golang中各种永远阻塞的方法
在Golang中各种永远阻塞的姿势 Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序. 可以通过调用os.Exit或从main()函数的返回来以正常方式终 ...
- golang中,new和make的区别
在golang中,make和new都是分配内存的,但是它们之间还是有些区别的,只有理解了它们之间的不同,才能在合适的场合使用. 简单来说,new只是分配内存,不初始化内存: 而make即分配又初始化内 ...
- Golang中Goroutine与线程
我们在使用Go语言进行开发时,一般会使用goroutine来处理并发任务.那么大家有没有考虑过goroutine的实现机制是什么样的?很多同学会把goroutine与线程等同起来,但是实际上并不是这样 ...
最新文章
- java取list中最大数值_Java后台通过Collections获取list集合中最大数,最小数代码
- Spark入门教程(二)Spark2.2源码编译及安装配置
- 把企业分“三只鸟”的发展好比“三个策略”
- python模块详解 time与date time
- hive_0.11中文用户手册
- 《日志管理与分析权威指南》一1.6 人、过程和技术
- 【LeetCode】【HOT 100】2. 两数相加
- 【老生谈算法】matlab实现Retinex理论的图像去雾算法源码——图像去雾算法
- “add measurements”(添加度量)菜单问题
- bzoj 5394: [Ynoi2016]炸脖龙 扩展欧拉定理+树状数组
- python股票预测_python用线性回归预测股票价格的实现代码
- 数据库毕业设计选题系统课程设计
- 一政网好吗,考公务员报班的作用
- vue 有关于命名大小写的问题
- MTK联发科技股份有限公司(MediaTek.Inc)
- Java爬虫爬取wallhaven的图片
- 2019/12/25 学习总结(待填坑)
- 新版 CCIE EI 和老版 CCIE RS 有什么区别?-ielab
- 适用于CodeJam的输入输出方式
- 厉害了!印度老头:从雅虎挖来陆奇,All in云业务,带领微软重生!
热门文章
- intellijidea课程 intellijidea神器使用技巧 3-1 列操作
- 安装nginx+ngx_lua支持WAF防护功能
- struts2官方 中文教程 系列一:创建一个struts2 web Application
- iOS 改变UILabel部分颜色
- Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp
- 网页中如何启用QQ交谈
- 子查询二(在HAVING子句中使用子查询)
- xml xslt中的空格输出处理
- 欢迎使用CSDN-markdown编辑器(此为使用指南,自己还不熟练有些功能的使用)
- LVS DR模式部署