要從源代碼導入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許可獲得許可。