type Pool

Pool представляет собой набор временных объектов, которые могут быть сохранены и восстановлены индивидуально.

Любой элемент, хранящийся в Pool, может быть удален автоматически в любое время без уведомления. Если Pool содержит единственную ссылку, когда это происходит, элемент может быть освобожден.

Pool безопасен для одновременного использования несколькими горрутинами.

Целью Pool является кэширование выделенных, но неиспользуемых элементов для повторного использования, снимая давление на сборщик мусора. То есть, упрощает создание эффективных, безопасных для потоков списков. Однако он не подходит для всех свободных списков.

Надлежащее использование Pool заключается в управлении группой временных элементов, которые в автоматическом режиме разделяются и могут повторно использоваться параллельными независимыми клиентами пакета. Pool предоставляет способ амортизации накладных расходов на распределение по многим клиентам.

Примером хорошего использования Pool является пакет fmt, который поддерживает хранилище временных буферов с динамическим размером. Хранилище масштабируется под нагрузкой (когда многие горутины активно выводятся) и сжимается при работе.

С другой стороны, свободный список, поддерживаемый как часть короткоживущего объекта, не подходит для Pool, поскольку накладные расходы не амортизируются в этом сценарии. Эффективнее, чтобы такие объекты реализовывали свой собственный бесплатный список.

Pool нельзя копировать после первого использования.

type Pool struct {

        // New optionally specifies a function to generate
        // a value when Get would otherwise return nil.
        // It may not be changed concurrently with calls to Get.
        New func() interface{}
        // contains filtered or unexported fields
}

Пример:

package main

import (
    "bytes"
    "io"
    "os"
    "sync"
    "time"
)

var bufPool = sync.Pool{
    New: func() interface{} {
        // The Pool's New function should generally only return pointer
        // types, since a pointer can be put into the return interface
        // value without an allocation:
        return new(bytes.Buffer)
    },
}

// timeNow is a fake version of time.Now for tests.
func timeNow() time.Time {
    return time.Unix(1136214245, 0)
}

func Log(w io.Writer, key, val string) {
    b := bufPool.Get().(*bytes.Buffer)
    b.Reset()
    // Replace this with time.Now() in a real logger.
    b.WriteString(timeNow().UTC().Format(time.RFC3339))
    b.WriteByte(' ')
    b.WriteString(key)
    b.WriteByte('=')
    b.WriteString(val)
    w.Write(b.Bytes())
    bufPool.Put(b)
}

func main() {
    Log(os.Stdout, "path", "/search?q=flowers")
}

results matching ""

    No results matching ""