Go语言学习08-并发编程
Go语言学习08-并发编程
Thread vs. Groutine
创建时默认的stack的大小
- JDK5 以后 Java Thread stack 默认为 1M
- Groutine 的 Stack 初始化大小为 2K
和 KSE (Kernel Space Entity) 的对应关系
- Java Thread 是 1:1
- Groutine 是 M:N
1 | func TestGroutine(t *testing.T) { |
共享内存并发机制
1 | func TestCounterThreadSafe(t *testing.T) { |
CSP并发机制
CSP vs. Actor
和Actor的直接通讯不不同,CSP模式则是通过Channel进行通讯的,更松耦合⼀些
Go中channel是有容量限制并且独立于处理Groutine,而如Erlang,Actor模式中的mailbox容量是无限的,接收进程也总是被动地处理消息。
Channel
1 | func service() string { |
多路选择和超时控制
select
多渠道的选择1 | select { |
1 | select { |
channel的关闭和广播
channel的关闭
- 向 关闭的channel发送数据, 会导致 panic
v, ok <-ch
; ok 为bool值, true 表示正常接受, false 表示通道关闭- 所有的 channel 接收者都会在channel关闭时, 立刻从阻塞等待中返回且上述ok值为false. 这个广播机制常被利用, 进行向多个订阅者同时发送信号. 如: 退出信号
1 | func dataProducer(ch chan int, wg *sync.WaitGroup) { |
context处理复杂场景任务的取消
1 | func isCancelled(cancelChan chan struct{}) bool { |
Context与关联任务取消
- 根Context: 通过 context.Background() 创建
- 子Context: context.WithCancel(parentContext) 创建
- ctx, cancel := context.WithCancel(context.Background())
- 当前Context 被取消时, 基于他的子 context 都会被取消
- 接收取消通知
<-ctx.Done()
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 技术匝记簿!
评论