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
评论里面有不少同学要求老师讲解 go mod
去看了 go module 的入门文档 https://blog.golang.org/using-go-modules
不过有一些地方没能搞清楚,比如 import "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 等待队列中,或全局等待队列当中。
当协程被中断的时候,它在寄存器中的运行状态,也会保存在协程对象中;当重新开始运行的时候,就会把运行状态写回寄存器。
版权声明: 本文为 InfoQ 作者【escray】的原创文章。
原文链接:【http://xie.infoq.cn/article/7a3d4e4f2c27bb8f5bdc250fa】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论