在Go程序中你会一遍又一遍地看到for-select循环:
```
for { // 无限循环或遍历
select {
// 对通道进行操作
}
}
```
比较常见的有以下几种不同的情况:
***在通道上发送迭代变量***
通常情况下,你需要将可迭代的内容转换为通道上的值。
```
for _, s := range []string{"a", "b", "c"} {
select {
case <-done:
return
case stringStream <- s:
}
}
```
***无限循环等待停止***
创建无限循环直到停止的例子很常见。这有一些变化。 你选择哪一个纯粹是一种偏好。
第一种变体保持select语句尽可能短:
```
for {
select {
case <-done:
return
default:
}
// 执行非抢占任务
}
```
如果done通道没有关闭,我们会退出select语句并执行循环体剩下的部分。
第二种变体将任务嵌入到select语句的默认子句中:
```
for {
select {
case <-done:
return
default:
// 执行非抢占任务
}
}
```
当我们进入select语句时,如果done通道尚未关闭,我们将执行default子句。
这种模式没有什么高深的地方,但它展示了最常见的使用方式,所以值得一提。
* * * * *
学识浅薄,错误在所难免。我是长风,欢迎来Golang中国的群(211938256)就本书提出修改意见。
- 前序
- 谁适合读这本书
- 章节导读
- 在线资源
- 第一章 并发编程介绍
- 摩尔定律,可伸缩网络和我们所处的困境
- 为什么并发编程如此困难
- 数据竞争
- 原子性
- 内存访问同步
- 死锁,活锁和锁的饥饿问题
- 死锁
- 活锁
- 饥饿
- 并发安全性
- 优雅的面对复杂性
- 第二章 代码建模:序列化交互处理
- 并发与并行
- 什么是CSP
- CSP在Go中的衍生物
- Go的并发哲学
- 第三章 Go的并发构建模块
- Goroutines
- sync包
- WaitGroup
- Mutex和RWMutex
- Cond
- Once
- Pool
- Channels
- select语句
- GOMAXPROCS
- 结论
- 第四章 Go的并发编程范式
- 访问范围约束
- fo-select循环
- 防止Goroutine泄漏
- or-channel
- 错误处理
- 管道
- 构建管道的最佳实践
- 便利的生成器
- 扇入扇出
- or-done-channel
- tee-channel
- bridge-channel
- 队列
- context包
- 小结
- 第五章 可伸缩并发设计
- 错误传递
- 超时和取消
- 心跳
- 请求并发复制处理
- 速率限制
- Goroutines异常行为修复
- 本章小结
- 第六章 Goroutines和Go运行时
- 任务调度