Suche…


Einführung

sync.Pool speichert einen Cache mit zugewiesenen, aber nicht verwendeten Elementen für die spätere Verwendung. Dadurch werden Speicheränderungen bei häufig geänderten Sammlungen vermieden und eine effiziente, Thread-sichere Wiederverwendung des Speichers ermöglicht. Es ist nützlich, eine Gruppe temporärer Elemente zu verwalten, die von gleichzeitigen Clients eines Pakets gemeinsam genutzt werden, z. B. eine Liste von Datenbankverbindungen oder eine Liste von Ausgabepuffern.

sync.Pool

Mit der sync.Pool Struktur können wir Objekte zusammenfassen und wiederverwenden.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow