一、golang常用并发编程的几种模式
1、扇入扇出
1、所谓的扇入是指将多路通道聚合到一条通道中处理,Go语言最简单的扇入就是使用select聚合多条通道服务;
2、所谓的扇出是指将一条通道发散到多条通道中处理。在Go语言里面实现就是使用go关键字启动多个goroutine并发处理。
3、扇入就是合,扇出就是分。
4、当生产者的速度很慢时,需要使用扇入技术聚合多个生产者满足消费者,比如很耗时的加密/解密服务;
5、当消费者的速度很慢时,需要使用扇出技术,比如Web服务器并发请求处理。扇入和扇出是Go并发编程中常用的技术。
扇入扇出和pipeline(管道)的最大区在于,管道是串行的,但是扇入扇出是并行的。并行是指,一个管道可以接收其它多个数据源的输入,前提是管道对于多个数据源的输入顺序是不敏感的。
管道的核心思想在于,每个单独的输入都有一个单独goroutine处理,并写入同一个数据源。

扇入案例
package main
import (
"fmt"
"math/rand"
)
func GenerateIntA() chan int {
ch := make(chan int, 10)
go func() {
for {
ch <- rand.Int()
}
}()
return ch
}
func GenerateIntB() chan int {
ch := make(chan int, 10)
go func() {
for {
ch <- rand.Int()
}
}()
return ch
}
func GenerateInt() chan int {
ch := make(chan int, 20)
go func() {
// 使用select的扇入技术(Fan in)增加生成的随机源
for {
select {
case ch <- <-GenerateIntA():
case ch <- <-GenerateIntB():
}
}
}()
return ch
}
func main() {
ch := GenerateInt()
for i := 0; i < 100; i++ {
fmt.Println(<-ch)
}
}
2.优胜劣汰模式
场景:执行远程访问,远程服务响应不可靠的时候,同时开启go程,只取最快返回的,可以提高程序性能,但是占用资源会高一些
func job() int{
rand.Seed

最低0.47元/天 解锁文章
806

被折叠的 条评论
为什么被折叠?



