当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


GO Pool用法及代码示例


GO语言"sync"包中"Pool"类型的用法及代码示例。

池是一组可以单独保存和检索的临时对象。

存储在池中的任何项目都可能随时自动删除,恕不另行通知。如果在发生这种情况时 Pool 拥有唯一的引用,则该项目可能会被释放。

一个 Pool 可以安全地同时被多个 goroutine 使用。

Pool 的目的是缓存已分配但未使用的项目以供以后重用,减轻垃圾Collector的压力。也就是说,它使构建高效、线程安全的空闲列表变得容易。但是,它并不适用于所有空闲列表。

Pool 的适当用途是管理一组在包的并发独立客户端之间静默共享并可能被重用的临时项目。 Pool 提供了一种在许多客户端之间分摊分配开销的方法。

一个很好地使用池的例子是在 fmt 包中,它维护一个动态大小的临时输出缓冲区存储。存储在负载下扩展(当许多 goroutine 正在积极打印时)并在静止时缩小。

另一方面,作为short-lived 对象的一部分维护的空闲列表不适合用于池,因为在这种情况下开销不能很好地摊销。让这些对象实现它们自己的空闲列表更有效。

首次使用后不得复制池。

用法:

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() any
    // contains filtered or unexported fields
}

例子:

package main

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

var bufPool = sync.Pool{
	New: func() any {
		// 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")
}

输出:

2006-01-02T15:04:05Z path=/search?q=flowers

相关用法


注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 Pool。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。