Go
Pula pamięci
Szukaj…
Wprowadzenie
sync.Pool przechowuje pamięć podręczną przydzielonych, ale nieużywanych elementów do przyszłego użytku, unikając utraty pamięci w przypadku często zmienianych kolekcji i umożliwiając efektywne, bezpieczne dla wątków ponowne wykorzystanie pamięci. Przydatne jest zarządzanie grupą tymczasowych elementów współdzielonych między równoległymi klientami pakietu, na przykład listą połączeń z bazą danych lub listą buforów wyjściowych.
sync.Pool
Korzystając sync.Pool
struktury sync.Pool
, możemy łączyć obiekty i wykorzystywać je ponownie.
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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow