gpt4 book ai didi

go - 如何正确使用 sync.pool 进行 slice

转载 作者:行者123 更新时间:2023-12-01 22:45:35 25 4
gpt4 key购买 nike

关闭。这个问题需要details or clarity .它目前不接受答案。












想改进这个问题?通过 editing this post 添加详细信息并澄清问题.

1年前关闭。




Improve this question




我正在构建一个 Go 应用程序来服务数千个 HTTP 请求。服务包括解析输入、处理它并返回输出。
输入解析包括解析jsonmap[string]string 的列表中
如何为此解析实现内存池?
最小可重现示例:

var poolTest *sync.Pool

func init() {
poolTest = &sync.Pool{
New: func() interface{} {
return new([]map[string]string)
},
}
}

func Requesthandler (ctx *fasthttp.RequestCtx) {
poolTestList := poolTest.Get().(*[]map[string]string)
input := ctx.PostBody()
_=json.Unmarshal(input, poolTestList)

//do something
print(*(poolTestList))

//clear and return to pool
(*poolTestList) = (*poolTestList)[:0]
poolTest.Put(poolTestList)
}

func main() {
_ = (&fasthttp.Server{
Handler: Requesthandler,
ReadBufferSize: 8192,
TCPKeepalive: true,
}).ListenAndServe(":3000")
}
我感到困惑的部分是清理并返回池。
这是正确的方法吗?

最佳答案

您的实现通常是正确的,但这里有一些奇怪的事情。首先,您几乎不需要指向 slice 的指针;你在这里似乎不需要一个。您的值应该只是 []map[string]string不是 *[]map[string]string .
二、per the examples ,最佳做法是在 Get 之后重置池化对象,而不是在 Put 之前.这是最安全的,因为它意味着 Get不会对其从池中收到的值做出任何潜在的不安全假设。如果项目倾向于在池中停留很长时间并且非常大,您也可以同时执行这两种操作(这里的 map slice 可能会占用非常高的内存,因此这将取决于您的用例)。
请注意,//do something 中的内容可能是相关的,因为您在这里使用的是具有引用语义的 map 和 slice 。如果任何 slice 或映射泄漏此方法,您可能会遇到一些潜在的问题,即无意共享内存,这可能很难诊断。
最后,请记住,此代码不是池化 map ,而是池化 slice 。因此,如果这些是大型 map 的简短列表,那么这里的好处可能很少。事实上,即使它们是一长串 map ,它也可能很少。我会删除池代码、基准和配置文件,并确保您实际上正在优化与性能相关的内容。

关于go - 如何正确使用 sync.pool 进行 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62677660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com