/jelly

弹性channel池

Primary LanguageGoApache License 2.0Apache-2.0

jelly

弹性channel池,用来接收数据并处理,当数据超出负载设置时扩容,当数据量减少时收缩。

channel pool

  • LoadFactor:负载系数,默认为3(容量右移位数,也可以理解为当前缓存数据到达缓存容量的87.5%时,为满载)

  • Selector:用于选择哪条channel来发送数据

  • Recv:后台不停调用,接收到值后调用处理函数callback(v interface{})

  • grow():当容量<<负载系数 > 剩余空间时,增加option.Step个channel来减轻当前channel的负载

  • shrink():当收缩option.Step个channel后还不会达到满载时,就直接收

Example:

func main() {
    var w sync.WaitGroup
	pool, err := NewChanPool(DefaultOption, func(v interface{}) {
        //todo 处理v
        fmt.Println(v)
		w.Done()
	})
	if err != nil {
        panic(err)
	}
	err = pool.StartRecv()
	if err != nil {
		panic(err)
	}
    w.Add(1000)
	for i := 0; i < 5; i++ {
		go func() {
			for i := 0; i < 200; i++ {
                pool.Send(i, true) // Send(值,是否允许阻塞)
			}
		}()
	}
	go func() {
		timer := time.NewTimer(5 * time.Second)
		<-timer.C
		t.Fatal("time out")
	}()
	w.Wait() //等待结束
}