goroutine
理论基础 :CSP 模型
Communication Sequential Process
don,t communicate by sharing memory, share memory by communicating
不要通过共享内存来通信,而是通过通信来共享内存
我的理解: 不要先去内存占座, 而是在数据交互的时候去”分坐“
先有数据 再分配资源
协程 coroutine
轻量级"线程"
非抢占式,主动交出控制权
编译器/解释器/虚拟机层面
linux 安装 go
wget https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gz
# 解压文件
tar xfz go1.13.4.linux-amd64.tar.gz -C /usr/local
#修改~/.bashrc
vim ~/.bashrc
#添加Gopath路径
export GOPATH=/usr/local/go
export PATH=$GOPATH/bin:$PATH
# 激活配置
source ~/.bashrc
# 我用的是oh my zsh, 所以改 ~/.zshrc
source ~/.zshrc
vim ~/.zshrc
#变量修改为一下配置
export GOROOT=/usr/local/go
export GOPATH=$PATH:$GOROOT/bin
#check
go version
warning : GOPATH set to GOROOT (/usr/local/go) has no effect
GOPATH set to GOROOT (/usr/local/go) has no effect
协程 Coroutine
python: yield 关键字, 3.5 async def 原生支持
C++ : Boost.Coroutine
Java : 不支持
只要函数前面加上go , 就能送给调度器运行, 非常方便, 不像 Python, 要在定义时声明: async def
调度器在合适的点进行切换 , 是固定的逻辑
可以使用 -race 来检测数据访问冲突
goroutine 可能的切换点
- I/O , select
- chan