langShift

Channel 和 Select 深入

Channel 和 select 语句是 Go 并发模型的核心。虽然前面的模块涵盖了基础知识,但本模块探索了使 Go 并发模型如此强大和富有表现力的高级模式和技巧。

Channel 方向性

Go channel 可以是定向的,允许你指定 channel 是用于发送、接收还是两者兼有。这提供了编译时安全性,并使代码意图更清晰。

正在加载...

高级 Select 模式

带 Default 的 Select

select 中的 default 分支允许非阻塞的 channel 操作:

正在加载...

带超时的 Select

使用 selecttime.After 提供超时功能:

正在加载...

Channel 模式

Fan-Out 模式

Fan-out 模式将工作从一个 channel 分发到多个工作线程:

正在加载...

Fan-In 模式

Fan-in 模式将多个 channels 合并为一个:

正在加载...

Channel 组合

带错误处理的管道

构建具有错误处理的健壮管道:

正在加载...

Context 和取消

使用 context 和 channels 进行取消:

正在加载...

Channel 最佳实践

1. 始终由发送者关闭 Channel

正在加载...

2. 避免 Channel 泄漏

正在加载...

练习题:

  1. 只发送 channel 和只接收 channel 有什么区别?
  2. select 中的 default 分支如何实现非阻塞操作?
  3. 解释 fan-out 和 fan-in 模式以及何时使用每种模式。
  4. 如何使用 channels 和 select 实现超时功能?
  5. 关闭 channels 和防止泄漏有哪些最佳实践?

项目想法:

创建一个使用 channels 将传入请求分发到多个工作 goroutine 的负载均衡器。负载均衡器应该实现健康检查、优雅关闭和请求超时处理,使用本模块中学到的模式。