写点什么

Go Goroutine

用户头像
escray
关注
发布于: 2021 年 04 月 19 日
Go Goroutine

极客时间《Go 语言从入门到实践》学习笔记 06

21 | 构建可复用的模块(包)


可能是因为 Go 版本的问题,我在试图 import 的时候失败了,go version 1.16,VS Code。估计是配置的问题,报错信息里面提示 GOROOT 之类的。


可能需要采用 Go mod 的方式


我之前自己“作”,取消了老师的那种目录层级,把源码文件都放到了 src 目录下,放到一个 package 里面,结果悲剧了。


不过好在远程的那个例子执行没问题。

22 | 依赖管理


gilde 上一次更新已经是 2019 年 7 月份的事情了,项目主页也的确推荐了 Go Modules。


主要还是因为来学这门课的时间有点晚了。


只是看了一下老师的演示,没有照着操作,特别是还需要安装 glide


> brew install glide> glide init> vim glide.yaml> glide install
复制代码


评论里面有不少同学要求老师讲解 go mod


去看了 go module 的入门文档 https://blog.golang.org/using-go-modules


不过有一些地方没能搞清楚,比如 import "rsc.io/quote" 之后,报错


imported and not used: "rsc.io/quote"
复制代码


留待以后解决。


技术的更新实在太快,隔壁的《Go 语言核心 36 讲》 2018 年出品,估计其中也没有 go mod 内容。


23 | 协程机制


听写:


协程是更轻量级的线程


Thread 和 Kernel Entity  如果是 1:1 的话,Kernel Entity(系统线程)由 CPU 直接调度,调度效率非常高,但是线程之间发生 Context 切换的时候,会牵扯到内核对象切换,消耗比较大。


如果是 M:N 的话,那么切换的时候消耗就会小很多。


Processor 在不同的系统线程里,每个 Processor 都挂着一个准备运行的协程队列 G-G-G…… 有一个协程正在运行,协程队列依次运行。


Go 启动的时候,会有一个守护线程 G0,计数,会记录每个 Processor 运行完成的协程的数量,如果发现某一个 Processor 在一段时间内没有发生变化(阻塞),就会往这个协程的任务栈里面插入一个特殊的标记,当协程运行遇到非内联函数,就会读到这个标记,将自己中断下来,插到等待协程队列的队尾,切换到其他队列的队尾。


当某一个协程被系统通断了,比如 IO 需要等待的时候,Processor 会把自己加入到其他可使用的系统线程之中,继续执行其他的协程 Goroutine。当被中断的协程被唤醒,完成之后,会把自己加入到其他某一个 Processor 等待队列中,或全局等待队列当中。


当协程被中断的时候,它在寄存器中的运行状态,也会保存在协程对象中;当重新开始运行的时候,就会把运行状态写回寄存器。

发布于: 2021 年 04 月 19 日阅读数: 15
用户头像

escray

关注

Let's Go 2017.11.19 加入

Let's Go,用 100 天的时间从入门到入职

评论

发布
暂无评论
Go Goroutine