0. 前言
在很多地方,都能看见Go处理并发,他能力确实强,比java更懂得处理并发。有人把Go语言比作 21 世纪的C语言,Go语言设计简单,并发程序设计,而 Go 从语言层面就支持并发。同时实现了自动垃圾回收机制。并发机制运用起来非常简便,在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量。Go 的并发模型,相对于传统的进程、线程,已经能接收更多的并发请求,这工作是框架会实现的,不用我们考虑。但请求接收进来要能被快速处理,为提高并发性,还是要从处理函数入手。
1. channel
Go 使用 channel 和 goroutine 开发并行程序的能力。
goroutine叫做 goroutine 是因为已有的短语——线程、协程、进程等等——传递了不 准确的含义。goroutine 有简单的模型:它是与其他 goroutine 并行执行的, 有着相同地址空间的函数。。它是轻量的,仅比分配栈空间多一点点✷㧆。 而初始时栈是很小的,所以它们也是ᡸ价的,并且随着需要在堆空间上分 配(和释放)。
创建 channel ci 用于发送和接收整数,创建 channel cs 用于字符串,以及 channel cf 使用了空接口来满足各种类型。向 channel 发送或接收数据,是通过类似的操作符完成的:具体作用则依赖于操作符的位置。
- ci <− 1 ← 发送整数 1 到 channel ci
- <−ci ← 从 channel ci 接收整数
- i := <−ci ← 从 channel ci 接收整数,并保存到 i 中
var c chan int
func ready(w string, sec int) {
time.Sleep(time.Duration(sec) * time.Second)
fmt.Println(w, "is ready!")
c <− 1
}
func main() {
c = make(chan i n t)
go ready("Tea", 2)
go ready("Coffee", 1)
fmt.Println("I'm waiting, but not too long")
}
- 定义 c 作为 int 型的 channel。就是说:这个 channel 传输整数。注意这个变量是 全局的,这样 goroutine 可以访问它
- 发送整数 1 到 channel c
- 初始化 c
- 用关键字 go 开始一个 goroutine
- 等待,直到从 channel 上接收一个值。注意,收到的值被丢弃了
- 两个 goroutines,接收两个值
注意上面代码不得不从 channel 中读取两次Go 内建的关键字:select。通过 select(和其他东西)可以监听 channel 上输入的数据。
2. 关闭 channel
当 channel 被关闭后,读取端需要知道这个事情
x, ok = <−ch
当 ok 被赋值为 true 意味着 channel 尚未被关闭,同时可以读取数据。否则 ok 被赋 值为 false。在这个情况下表示 channel 被关闭。只读或只写 channel
本文正在参加技术专题18期-聊聊Go语言框架