写点什么

Golang 对象池

用户头像
escray
关注
发布于: 2021 年 04 月 22 日
Golang 对象池

极客时间《Go 语言从入门到实践》学习笔记 09,题图来自网络

30 | 只运行一次


在 @Vincent 的留言及其回复里面,学到了有关的空结构体 empty struct 的概念


https://dave.cheney.net/2014/03/25/the-empty-struct

https://www.golangtc.com/t/575442b8b09ecc02f7000057


另外关于 unsafe.Pointer


https://golang.org/pkg/unsafe/#Pointerhttps://go101.org/article/unsafe.html

31 | 仅需任意任务完成


我觉的 Go 语言的作者,其实是把并发编程中的一些痛点拿出来,做了专门的优化,比如这一讲的“仅需任意任务完成”。


我对于 WaitGroup 和 Channel close 部分的代码似乎有些混淆,希望后面能慢慢理清楚。


使用 buffer channel 可以避免协程泄漏,那么是不是在大部分的情况下,都应该优先 buffer channel 而不是 unbuffered channel?


老师在留言里面回复了大部分的代码问题,这个还是挺难得的,当然总体留言数目不多。


我也从留言里面学到很多。


32 | 所有任务完成


从示例代码来看,与上一节相比,仅仅只是多了一个聚合操作,将所有协程的操作,ch <- ret,从 channel 中取出来,+= <-ch,然后再 return。


如果和 WaitGroup 的方式来比较的话,不知道各自有什么优劣?

33 | 对象池


创建代价比较高的对象,比如连接(连接池),可以使⽤ buffered channel 实现对象池。


buffered channel 可以设定 buffer 的大小,也就相当于池的大小,将所有的对象在池中放好

超时:不能让获取对象的人,永远的阻塞


取对象的时候,通常都需要有一个超时控制


高可用性系统:slow response quick failure


老师在视频里面讲:slow response 是比 quick failure 更糟糕的一种情况


我找到的原文应该是在 Release It! 中的


A slow response is worse than refusing a connection or returning an error.


或者是:


Slow response is worse than no response.


推荐使用不同类型的池来放置不同的对象。


使用对象池,不一定会提升系统的性能;如果对象相对简单,易于创建的话,可能需要进一步的测试和评估

34 | sync.pool 对象缓存


sync.pool 对象缓存,而不是对象池,不适合于做连接池


私有对象,而不是私有对象池


私有对象访问的时候(写入)不需要锁;共享池写入需要锁


如果使用 sync.pool 来缓存对象,那么每次访问的时候都有可能会遇到锁的问题,锁的开销和创建对象的开销需要进行比较和权衡,才能决定应该使用哪种方式。


go 1.13 版本后,对于 sync.pool 中缓存的对象,会被放入 victim 中,此时还可以被访问到,直到第二次 GC


我觉的这门课程应该是老师和同学们共创,如果不看留言的话(包括作者回复部分),那么会缺失不少内容。

发布于: 2021 年 04 月 22 日阅读数: 11
用户头像

escray

关注

Let's Go 2017.11.19 加入

Let's Go,用 100 天的时间从入门到入职

评论

发布
暂无评论
Golang 对象池