一、goroutine

  • goroutine就是Go语言提供的一种用户态线程。Go自己实现了goroutine的调度器(Scheduler),Go的调度器由三部分组成:
  • M:指的是Machine,一个M直接关联了一个内核线程。
  • P:指的processer,代表M所需的上下文环境,也是处理用户级代码逻辑的处理器。P的数量可以通过GOMAXPROCS()来设置,默认值是CPU的核数。
  • G:指的是goroutine,其实本质上也是一种轻量级的线程。

二、goroutine和线程的区别

1、内存占用

创建一个goroutine大概2KB的栈空间,新创建的线程会占用1MB的内存空间。

2、创建和销毁的开销

线程需要从操作系统里请求资源并在用完之后释放回去,因此创建和销毁线程的开销非常大。
goroutine的创建和销毁是由运行环境(runtime)完成的,这些操作的开销就比较小。

3、切换开销

当切换一个线程的时候,调度器需要保存/恢复所有的寄存器。这包括16个通用寄存器,程序指针(program counter),栈指针(stack pointer),段寄存器(segment registers)和16个XMM寄存器,浮点协处理器状态,16个AVX寄存器,所有的特殊模块寄存器(MSR)等。当在线程间快速切换的时候这些开销就变得非常大了
Goroutine的调度是协同合作式的(cooperatively)。当切换goroutine的时候,调度器只需要保存和恢复三个寄存器 - 程序指针,栈指针和DX。切换的开销就小多了。

三、goroutine执行过程

四、goroutine并发

并行:是让不同的代码片段同时在不同的物理处理器上执行,并行的关键是同时做很多事情。
并发:指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了,goroutine是一种并发机制。

五、goroutine代码示例

  • 下面例子只会输出2,不会输出 1 3,因为当程序优先执行主线程,当主线程执行完后就退出了。
package mainimport "fmt"func main() {var i = 3go func(a int) {fmt.Println(a)fmt.Println("1")}(i)fmt.Println("2")
}
  • 这个例子是分部打印三次大小写字母,大家可以把runtime.GOMAXPROCS(2)或者time.Sleep(time.Millisecond)注释取消掉,再看下运行结果,每次输出都不一样有助于进一步理解goroutine。
package mainimport ("runtime""sync""fmt"
)func main() {// 分配一个逻辑处理器给调度器使用runtime.GOMAXPROCS(1)// wg用来等待程序完成,计数加2,表示要等待两个goroutinevar wg sync.WaitGroupwg.Add(2)fmt.Println("Start Goroutines")// 声明一个匿名函数,并创建一个goroutinego func() {// 延时调用,在函数退出时调用done来通知main函数工作已经完成defer wg.Done()// 显示字母表三次for count := 0; count < 3; count ++ {for char := 'a'; char < 'a' + 26 ; char ++  {fmt.Printf("%c ", char)}}}()go func() {defer wg.Done()for count := 0; count < 3; count ++ {for char := 'A'; char < 'A' + 26 ; char ++  {//time.Sleep(time.Millisecond)fmt.Printf("%c ", char)}}}()fmt.Println("Wating To Finish")wg.Wait()fmt.Println("\nTerminating Program")
}

转载于:https://www.cnblogs.com/wudiffs/p/11576675.html

go语言--goroutine相关推荐

  1. TODO:Go语言goroutine和channel使用

    2019独角兽企业重金招聘Python工程师标准>>> TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语言运行时(r ...

  2. channelinactive触发后不关闭channel_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作...

    今天是golang专题第15篇文章,我们来继续聊聊channel的使用. 在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计 ...

  3. java case用法_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作

    今天是golang专题第15篇文章,我们来继续聊聊channel的使用. 在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计 ...

  4. [Go语言入门] 14 Go语言goroutine和通道详解

    文章目录 14 Go语言goroutine和通道详解 14.1 goroutine 14.2 通道(channel) 声明通道变量 创建通道 通道操作 14.3 管道 14.4 单向通道 14.5 通 ...

  5. Go语言 goroutine

    一.概念介绍 Go 语言是原生支持语言级并发的,这个并发的最小逻辑单元就是 goroutine.goroutine 就是 Go 语言提供的一种用户态线程,当然这种用户态线程是跑在内核级线程之上的.当我 ...

  6. c++ 初始化 代码 应放在那里_Go语言goroutine调度器初始化 (12)

    先吐槽一下,知乎编辑器居然不支持汇编语言,代码的空格也给我弄没了,你说你把运算符两边的空格搞掉就搞掉吧,还能看,你为啥要把if, for后面的空格也搞掉啊... 本文是<Go语言调度器源代码情景 ...

  7. Go语言goroutine+channel+select简介

    goroutine: Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine.goroutine就是Go语言提供的一种用户态线程,这种用户态线程是跑在内核级线程之上的,gorou ...

  8. go语言goroutine的取消

    go语言中使用 contex实现goroutine的取消 package mainimport ("context""fmt""sync"& ...

  9. GO语言goroutine

    前言 go语言对于并发编程有原生的支持. 如下代码:创建10个协程并发执行. package mainimport ("fmt""time" )func mai ...

最新文章

  1. mysql 触发器编程_【mysql的编程专题】触发器
  2. 斯坦福大学新研究:声波、光波等都是RNN
  3. 大道至简,回归到梦开始的地方。人生如此,编程亦如此。
  4. C# ThreadPool类(线程池)
  5. Leetcode每日必刷题库第5题,如何实现最长回文子串?
  6. 库克看下!华为MatePad 11月25日发布:剑指苹果
  7. 在SAE搭建微信公众账号服务
  8. javaweb(05):tomcat服务器的安装、启动,IDEA整合Tomcat创建动态web工程
  9. java 文件描述符_文件描述符了解一下
  10. GoF的23种设计模式分类概念
  11. PPT如何设置背景色并应用到全局
  12. 求解逆矩阵的常用三种方法
  13. Polkadot的PLO第一阶段: Equilibrium在DOT上筹集了850万美元
  14. 计算机怎么没有word文档,word没了怎么回事 为什么电脑没有了word
  15. 分销平台传统的宣传流程
  16. linux-iproute2系列-TC命令
  17. java拆分excel_apache poi拆分excel表格
  18. log4j的使用和log4j过时问题的解决
  19. 医学检验技术与计算机的发展,医学检验专业发展现状与前景
  20. 叶黄素的17种功效与副作用(5点使用禁忌请小心)

热门文章

  1. 兄弟mfc9140cdn无法识别_我共享了Brother打印设备。现在只能打印但无法扫描,该如何解决? .| Brother...
  2. dosbox edit.exe 如何使用_微软软件如何激活?这个神器分享给你!
  3. AcWing 2. 01背包问题(01背包模板)
  4. linux定时执行任务命令,crontab(linux下定时执行任务命令)
  5. python列表转为一个数字_关于python:将整数列表转换为一个数字?
  6. 2019华北五省计算机应用大赛官网,“远洋航空杯”2019年华北五省(市、自治区) 及港澳台大学生计算机应用大赛举行...
  7. [深度学习]什么叫梯度学习
  8. UVM的factory机制
  9. Spring MVC 3.2+ @ResponseBody 导致的中文乱码处理
  10. 分享:Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据