优雅的多channel通信(GoLang)
缘由
很早就听说了Golang的大名,只是远观(当时觉得太难了= =) 刚到公司的时候,研究过一段时间的coreos—-大部分都是Golang写的,还是觉得语法很啰嗦…… 几个月之前,老大就跟我谈过新系统可能用Golang来写,弥补我司只有Python这条技术线的弊端。 所以买了个视频学Golang,但是没有开始上手做东西,只是跟着教程了解了一些特性,然后就荒废了。
由于最近开始研究Python性能提升的可能,异步库gevent,直接的epoll,非拷贝的meoryview各种黑科技都用上,但是并发10K rps实在是没办法跨过的一道坎,索性,反正都是epoll/kevent,直接换Golang试试。
理解
后端开发,如果没有听过,Do not communicate by sharing memory; instead, share memory by communicating.那么你的地位可能就危险了。 前者需要考虑加锁避免race condition,加锁又会提高开发以及调试难度。而后者则可以将对共享memory的访问串行化,于是不用考虑race condition。
放例子
package main
import "fmt"
import "time"
func fibonacci(c, quit chan int) {
x, y := 1, 1
for {
select {
case c <- x:
x, y = y, x+y
case <- quit:
fmt.Println("quit")
return
}
}
}
func show(c, quit chan int) {
for i := 0; i < 10; i ++ {
fmt.Println(<- c)
}
quit <- 0
}
func main() {
data := make(chan int)
leave := make(chan int)
go show(data, leave)
go fibonacci(data, leave)
for {
time.Sleep(100)
}
}