Go
Geheugen pooling
Zoeken…
Invoering
sync.Pool slaat een cache van toegewezen maar ongebruikte items op voor toekomstig gebruik, vermijdt geheugenverlies voor vaak gewijzigde collecties en maakt efficiënt, thread-safe hergebruik van geheugen mogelijk. Het is handig om een groep tijdelijke items te beheren die worden gedeeld tussen gelijktijdige clients van een pakket, bijvoorbeeld een lijst met databaseverbindingen of een lijst met uitvoerbuffers.
sync.Pool
Met de sync.Pool
structuur kunnen we objecten poolen en hergebruiken.
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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow