一个重载服务,有很多优化思路,缓存,并行化都是不错的思路.
这里提供另外的一种思路:提前生产开销大的对象.
package main
import "time"
type BufferProducer struct {
needProduct func() bool
product func()
producerNum uint
}
func New(needProduct func() bool,
product func(),
producerNum uint) (bp *BufferProducer) {
bp = &BufferProducer{
needProduct: needProduct,
product: product,
producerNum: producerNum,
}
bp.Run()
return
}
func (bp *BufferProducer) Run() {
var f func()
f = func() {
defer func() {
go f()
}()
for {
if bp.needProduct() {
bp.product()
} else {
time.Sleep(100 \* time.Millisecond)
}
}
}
for i := uint(0); i < bp.producerNum; i\+\+ {
go f()
}
}
func (bp *BufferProducer) Stop() {
}
func main() {
qsize := int(100)
q := make(chan string, qsize)
bp := New(func() bool {
return len(q) < qsize/2
}, func() {
select {
case q <\- "item":
println("qsize:", qsize, "len q", len(q))
}
}, 10)
for {
println("qsize:", qsize, "len q", len(q))
_ = <-q
}
bp.Stop()
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于