多路復(fù)用
多路復(fù)用是讓一次處理多個(gè)隊(duì)列的技術(shù)。Apache使用處理每個(gè)連接都需要一個(gè)進(jìn)程,所以其并發(fā)性能不是很好。而Nginx使用多路復(fù)用的技術(shù),讓一 個(gè)進(jìn)程處理多個(gè)連接,所以并發(fā)性能比較好。同樣,在協(xié)程的場合,多路復(fù)用也是需要的,但又有所不同。多路復(fù)用可以將若干個(gè)相似的小服務(wù)整合成一個(gè)大服務(wù)。
那么讓我們用多路復(fù)用技術(shù)做一個(gè)更高并發(fā)的隨機(jī)數(shù)生成器吧。
// 函數(shù)rand_generator_3 ,返回通道(Channel)
funcrand_generator_3() chan int {
// 創(chuàng)建兩個(gè)隨機(jī)數(shù)生成器服務(wù)
rand_generator_1 := rand_generator_2()
rand_generator_2 := rand_generator_2()
//創(chuàng)建通道
out := make(chan int)
//創(chuàng)建協(xié)程
go func() {
for {
//讀取生成器1中的數(shù)據(jù),整合
out <-<-rand_generator_1
}
}()
go func() {
for {
//讀取生成器2中的數(shù)據(jù),整合
out <-<-rand_generator_2
}
}()
return out
}
上面是使用了多路復(fù)用技術(shù)的高并發(fā)版的隨機(jī)數(shù)生成器。通過整合兩個(gè)隨機(jī)數(shù)生成器,這個(gè)版本的能力是剛才的兩倍。雖然協(xié)程可以大量創(chuàng)建,但是眾多協(xié)程還是會(huì) 爭搶輸出的通道。Go語言提供了Select關(guān)鍵字來解決,各家也有各家竅門。加大輸出通道的緩沖大小是個(gè)通用的解決方法。
多路復(fù)用技術(shù)可以用來整合多個(gè)通道。提升性能和操作的便捷。配合其他的模式使用有很大的威力。