Go
Pool de mémoire
Recherche…
Introduction
sync.Pool stocke un cache des éléments alloués mais inutilisés pour une utilisation ultérieure, évitant ainsi le désabonnement de la mémoire pour les collections fréquemment modifiées, et permettant une réutilisation efficace et sécurisée de la mémoire. Il est utile de gérer un groupe d'éléments temporaires partagés entre des clients concurrents d'un package, par exemple une liste de connexions de base de données ou une liste de tampons de sortie.
sync.Pool
En sync.Pool
structure sync.Pool
, nous pouvons regrouper des objets et les réutiliser.
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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow