golang 开荒 - 0 - goroutine && channel

本文深入探讨了Golang中的goroutines和channels,强调了CSP模型和通过通信共享内存的重要性。goroutines作为轻量级线程,通过简单的go关键字启动,调度器在I/O、select和函数调用等点进行切换。文章还详细介绍了channel的类型、缓冲通道、关闭channel以及死锁的避免,同时提到了WaitGroup在并发任务等待中的应用和select的调度功能。此外,讨论了同步机制,如atomic操作,如何替代传统的共享内存同步方式。
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值