- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
10.4.2 可缓冲通道
这小节的主题是可缓冲通道。这些通道允许 Go 调度器快速把任务放入队列,为了能够处理更多的请求。而且,您可以使用缓冲通道作为 信号量 来限制整个应用程序。
这里介绍的技术工作如下: 所有进入的请求被转发到通道里,由它来逐个处理。当通道处理完一个请求后,它就发送消息给原来当调用者说它准备处理新当请求了。因此这个通道的缓冲能力限制它能保存的并发请求数。
这个技术用 bufChannel.go
中的代码来帮助介绍,分为四个部分。
bufChannel.go
的第一部分代码如下:
package main
import (
"fmt"
)
bufChannel.go
的第二部分代码如下:
func main() {
numbers := make(chan int, 5)
counter := 10
这个 numbers
通道的定义给它提供了存储五个整数的空间。
bufChannel.go
的第三部分代码显示如下:
for i:= 0; i < counter; i++ {
select{
case numbers <- i:
default:
fmt.Println("Not enough space for", i)
}
}
上面这段代码里,我们试图放 10 个整数到 numbers
通道。然而,由于 numbers
通道只有 5 个整数的空间,您就不能把 10 个整数都存入进去。
bufChannel.go
的其余代码如下:
for i := 0; i < counter + 5; i++ {
select {
case num := <- numbers:
fmt.Println(num)
default:
fmt.Println("Nothing more to be done!")
break
}
}
}
上面的代码里,我们试着使用 for
循环和 select
表达式读取 numbers
通道中的内容。只要 numbers
通道里有内容可读,select
表达式的第一个分支就会执行。如果 numbers
通道是空的,这个 default
分支就会执行。
执行 bufChannel.go
产生如下输出:
$go run bufChannel.go
Not enough space for 5
Not enough space for 6
Not enough space for 7
Not enough space for 8
Not enough space for 9
0
1
2
3
4
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论