要从源代码导入bpool,请使用Go Get命令。
获取-u github.com/unit-io/bpool
使用缓冲池将传入请求写入缓冲区,例如PUT或批处理操作,或在编写数据记录文件(在提交操作期间)时使用缓冲池。创建具有容量的BufferPool库的目的是执行初始写作对缓冲区的作用,而无需退回,直到缓冲池达到其目标尺寸为止。缓冲池不会丢弃任何GET或写入请求,但它为其添加了逐渐的延迟,以限制可用于编写的其他操作的内存使用量,例如记录或DB同步操作。
可以使用godoc.org服务获得详细的API文档。
通过将客户端导入到GO客户源代码中来利用客户端。例如,
导入“ github.com/unit-io/bpool”
遵循代码段(如果执行没有缓冲区容量)将消耗所有系统内存,并会引起恐慌。
buf := bytes.NewBuffer(make([]byte, 0, 2))
defer func() {
if r := recover(); r != nil {
fmt.Println("panics from blast")
}
}()
for {
_, err := buf.Write([]byte("create blast"))
if err != nil {
fmt.Println(err.Error())
return
}
}
代码段用于将BufferPool与容量一起使用,将通过向请求添加逐渐延迟而限制系统内存的使用,并且不会引起恐慌。
pool := bpool.NewBufferPool(1<<20, &bpool.Options{MaxElapsedTime: 1 * time.Minute, WriteBackOff: true}) // creates BufferPool of 16MB target size
buf := pool.Get()
defer pool.Put(buf)
for {
_, err := buf.Write([]byte("create blast"))
if err != nil {
fmt.Println(err.Error())
return
}
}
使用bpool.newbufferpool()方法,然后通过BufferSize参数创建新的缓冲池。
const (
BufferSize = 1<<30 // (1GB size)
)
pool := bpool.NewBufferPool(BufferSize, nil)
要从缓冲池获取缓冲区,请使用BufferPool.get()。当缓冲池达到其容量时,GET方法会逐渐延迟以限制系统内存的使用情况。
....
var buffer *bpool.Buffer
buffer = pool.Get()
写入缓冲区使用buffer.write()方法。
var scratch [8]byte
binary.LittleEndian.PutUint64(scratch[0:8], uint64(buffer.Size()))
b.buffer.Write(scratch[:])
....
读取缓冲区使用buffer.bytes()方法。该操作返回将存储在缓冲区中的下划线数据切片。
data := buffer.Bytes()
...
要将缓冲区放在池中使用缓冲区使用BufferPool.put()方法,此操作将重置下划线切片。如果容量低于目标尺寸,它还重置用于延迟Get操作的缓冲池间隔。
pool.Put(buffer)
...
要重置存储在缓冲区的下划线切片,然后继续使用缓冲区使用Buffer.Reset()方法而不是使用BufferPool.put()操作。
buffer.Reset()
....
如果您想做出贡献,请提供存储库并使用功能分支。欢迎拉动请求。
该项目已根据MIT许可获得许可。