Go
Memory pooling
Sök…
Introduktion
sync.Pool lagrar en cache av tilldelade men oanvända objekt för framtida användning, och undviker minneskämpa för ofta ändrade samlingar och möjliggör effektiv, trådsäker återanvändning av minne. Det är användbart att hantera en grupp tillfälliga objekt som delas mellan samtidiga klienter i ett paket, till exempel en lista över databasanslutningar eller en lista med utgångsbuffertar.
sync.Pool
Med hjälp av sync.Pool
struktur kan vi sync.Pool
objekt och återanvända dem.
package main
import (
"bytes"
"fmt"
"sync"
)
var pool = sync.Pool{
// New creates an object when the pool has nothing available to return.
// New must return an interface{} to make it flexible. You have to cast
// your type after getting it.
New: func() interface{} {
// Pools often contain things like *bytes.Buffer, which are
// temporary and re-usable.
return &bytes.Buffer{}
},
}
func main() {
// When getting from a Pool, you need to cast
s := pool.Get().(*bytes.Buffer)
// We write to the object
s.Write([]byte("dirty"))
// Then put it back
pool.Put(s)
// Pools can return dirty results
// Get 'another' buffer
s = pool.Get().(*bytes.Buffer)
// Write to it
s.Write([]bytes("append"))
// At this point, if GC ran, this buffer *might* exist already, in
// which case it will contain the bytes of the string "dirtyappend"
fmt.Println(s)
// So use pools wisely, and clean up after yourself
s.Reset()
pool.Put(s)
// When you clean up, your buffer should be empty
s = pool.Get().(*bytes.Buffer)
// Defer your Puts to make sure you don't leak!
defer pool.Put(s)
s.Write([]byte("reset!"))
// This prints "reset!", and not "dirtyappendreset!"
fmt.Println(s)
}
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow