目录

文章目录

  • 目录
  • Golang 的协程
  • go 关键字

Golang 的协程

Golang 的协程被称为 Goroutine。因为操作系统内核是不感知协程的,也就是说 Golang 需要自己实现一个协程的调度器,就是 GMP 模型。

  • G(Goroutine):每个 Gotoutine 对应一个 G 结构体,G 存储 Goroutine 的运行堆栈,状态,以及任务函数,可重用函数实体 G 需要保存到 P 的队列或者全局队列才能被调度执行。
  • M(Machine):M 是线程的抽象,代表真正执行计算的资源,在绑定有效的 P 后,进入调度执行循环,M 会从 P 的本地队列来执行。对 M 来说,P 提供了相关的执行环境,入内存分配状态,任务队列等。
  • P(Processor):P 是一个抽象的概念,不是物理上的 CPU 而是表示逻辑处理器。当一个 P 有任务,需要创建或者唤醒一个系统线程 M 去处理它队列中的任务。P 决定了同时执行的任务的数量,GOMAXPROCS 限制系统线程执行用户层面的任务的数量。

GMP 模型的基本运行过程:

  1. 首先创建一个 G,然后 G 被保存在 P 的本地队列或者全局队列。
  2. 这时 P 会唤醒一个 M,M 寻找一个空闲的 P 将 G 移动到它自己,然后 M 执行一个调度循环:调用 G 对象 => 执行 => 清理线程 => 继续寻找 Goroutine。
  3. 在 M 的执行过程中,上下文切换随时发生。当切换发生,任务的执行现场需要被保护,这样在下一次调度执行可以进行现场恢复。
  4. M 的栈保存在 G 对象,只有现场恢复需要的寄存器(SP,PC 等),需要被保存到 G 对象。

go 关键字

Golang 原生支持并发,体现在 Golang 提供了 go 关键字。

格式:

go 函数名(形参列表)

go 语句会直接开启一个新的运行时线程,即:Goroutine。Goroutine 的调度由 Go Runtime Scheduler 完成,同一个程序中所有的 Goroutine 共享同一个地址空间。

package mainimport ("fmt""time"
)func say(s string) {for i := 0; i < 5; i++ {time.Sleep(100 * time.Millisecond)fmt.Println(s)}
}func main() {go say("world")say("hello")
}

Go 语言编程 — 并发 — Goroutine 协程相关推荐

  1. go语言中的goroutine(协程)

    文章目录 goroutine(协程) 1.进程和线程说明: 2.并发和并行说明: 3.go协程和go主线程: 4.MPG 模式基本介绍 5.设置golang运行的cpu数 goroutine(协程) ...

  2. python协程和线程_python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是 ...

  3. python apply_async死锁_python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是不 ...

  4. go中的goroutine协程

    如下代码: package mainimport ("fmt""time" )//goroutine //python java C++多进程和多线程编程 // ...

  5. golang goroutine 协程原理

    一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字 ...

  6. golang goroutine协程运行机制及使用详解

    Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言.Go于2009年正式推出,国内各大互联网公司都有使用,尤其是七牛云,基本都是golang写的, ...

  7. Go 语言编程 — 并发 — 同步原语与锁

    目录 文章目录 目录 协程锁 协程锁 协程锁主要用于保证在执行 goroutine 的时候不阻塞 M. 举例:任务 A 需要修改 Z,任务 B 也需要修改 Z.如果是串行系统,A 执行完了,再执行B, ...

  8. Go语言学习笔记 - PART13 - 协程与通道

    协程 应用程序处理并发的部分 协程跟操作系统的线程之间不是一对一的关系 协程是独立执行的,它们之间必须同行才会变得有用 通道 负责协程之间的通信,从而避免所有由共享内存导致的陷阱 通道只能传输一种类型 ...

  9. python生成器单线程_「Python异步编程-3」协程、生成器、yield 的联系

    异步编程的基础在于理解协程,而协程的基础在于理解生成器,而生成器的基础在于理解yield关键字,下面就来说说这几个概念. 什么是yield关键字? 相当于return关键字,在每次next(),或者f ...

最新文章

  1. 【mybatis基础】mybatis开发dao两种方法
  2. OpenCV textDetectionModel和textRecognitionModel API的端到端的实例(附完整代码)
  3. Springcloud中的region和zone的使用
  4. Linux的FHS(文件系统结构标准)剖析
  5. Oracle运行set autotrace on报错SP2-0618、SP2-0611
  6. 网站页面间脚本传值 sessionStorage
  7. 一次安装tengine的经历
  8. 配置映射文件中使用的类的类型别名typeAliases
  9. net软件安装后不能卸载的解决方法
  10. iOS开发之NSData和NSString相互转换
  11. PHP在Windows下安装配置第一步
  12. 【知了堂学习心得】浅谈c3p0连接池和dbutils工具类的使用
  13. Mouse Without Borders 使用经验
  14. 腾讯云短信服务报错FailedOperation.TemplateIncorrectOrUnapproved
  15. OneBox Technical Support
  16. vue项目中使用flv.js实时播放 断流重连 关闭断流开发心得
  17. 投屏镜像工具玩手机游戏的优势
  18. perl基本语法四-正则表达式
  19. K-verse 小型活动来袭!
  20. 汇编码转机器码万能转换工具(Intel 32/64、ARM 大小端、Thumb大小端、ARM V8大小端、Thumb V8大小端、AArch64)

热门文章

  1. mysql创建删除触发器的时候_mysql触发器简介及如何创建和删除触发器
  2. er图转为数据流程图_draw.io for Mac(流程图绘制工具)
  3. bootstrapr表格父子框_使用Bootstrap Table建立父子表
  4. Science Advances文章揭示长时记忆的神经动态表征机制
  5. 漫威游戏的VR体验 让你尖叫
  6. 真的有能开光追的手游了!自带实机演示的那种,OPPO这次玩“大”了
  7. 清华《摸鱼学导论》开课啦!1000多学子在线摸鱼,开课老师为大一新生
  8. 打开正经图片,你可能会看到一张黄图,这种造假方法能同时骗过AI和人眼
  9. ICLR 2020将采用远程会议,首次在非洲办会可能就这样泡汤了
  10. vue cli3.0 引入eslint 结合vscode使用