Go语言圣经 - 第9章 基于共享变量的并发 - 9.8 goroutine和线程

第9章 基于共享变量的并发

前一章我们使用了goroutine和channel这样直接而自然的方式来实现并发的方法,有时候它们会存在一些问题

本章我们会更详细的介绍并发机制,尤其在goroutine之间共享变量,我们还会介绍goroutine和操作系统线程之间一些技术差别

9.8 goroutine和线程

goroutine和操作系统的线程区别只是一个量级,但是量变会导致质变,我们本节来区别一下

9.8.1 动态栈

一个goroutine会以一个很小的栈开始其生命周期,一般只需要2KB,它的工作机制和操作系统的线程一样,不同的是它的栈可以根据需要动态收缩,最大的栈有1GB,当然大多数情况下不需要这么大的栈

9.8.2 Goroutine的调度

OS线程调度我们可能都知道,它涉及硬件寄存器、内存、CPU以及寄存器等,比较基础

Go调动的机制有点像OS线程调度,但是它只关注goroutine,有自己的调度器,使用了一些技术手段,所以它的代价比线程小很多

9.8.3 GOMAXPROCS

Go调度器使用GOMAXPROCS变量来决定会有多少个OS线程同时执行Go代码。其默认值是运行机器上CPU的核数,比如在8核的机器上,调度器一次会在8个OS线程上去调度Go代码,当然这个变量可以被控制,参考如下代码

for {
	go fmt.Print(0)
	fmt.Print(1)
}

$ GOMAXPROCS=1 go run hacker-cliché.go
111111111111111111110000000000000000000011111...

$ GOMAXPROCS=2 go run hacker-cliché.go
010101010101010101011001100101011010010100110...

9.8.4 Goroutine没有ID号

还有一个非常重要的点就是goroutine它是没有id的,也就是说goroutine的身份是无法被获取到的,这种设计是有意而为之,这一点我们前面通过很多例子中的无法推测goroutine就已经感受到了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值