下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 34 | sync.pool对象缓存
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Go语言从入门到实战

共55讲 · 55课时,约700分钟
6092
免费
01 | Go语言课程介绍
免费
02 | 内容综述
免费
03 | Go语言简介:历史背景、发...
免费
04 | 编写第一个Go程序
免费
05 | 变量、常量以及与其他语言...
06 | 数据类型
07 | 运算符
08 | 条件和循环
09 | 数组和切片
10 | Map声明、元素访问及遍历
11 | Map与工厂模式,在Go语言...
12 | 字符串
13 | Go语言的函数
14 | 可变参数和defer
15 | 行为的定义和实现
16 | Go语言的相关接口
17 | 扩展与复用
18 | 不一样的接口类型,一样的...
19 | 编写好的错误处理
20 | panic和recover
21 | 构建可复用的模块(包)
22 | 依赖管理
23 | 协程机制
24 | 共享内存并发机制
25 | CSP并发机制
26 | 多路选择和超时
27 | channel的关闭和广播
28 | 任务的取消
29 | Context与任务取消
30 | 只运行一次
31 | 仅需任意任务完成
32 | 所有任务完成
33 | 对象池
34 | sync.pool对象缓存
35 | 单元测试
36 | Benchmark
37 | BDD
38 | 反射编程
39 | 万能程序
40 | 不安全编程
41 | 实现pipe-filter framew...
42 | 实现micro-kernel frame...
43 | 内置JSON解析
44 | easyjson
45 | HTTP服务
46 | 构建RESTful服务
47 | 性能分析工具
48 | 性能调优示例
49 | 别让性能被锁住
50 | GC友好的代码
51 | 高效字符串连接
52 | 面向错误的设计
53 | 面向恢复的设计
54 | Chaos Engineering
55 | 结束语
本节摘要
展开

精选留言(7)

  • 2019-04-04
    老师能否讲解一些Go语言的内存模型,以及Go语言的垃圾回收机制。
    Go语言和也向Java一样分为堆内存、栈内存和永久区吗?
    Go语言是使用协程去做垃圾回收的吗?是否和Java一样存在Stop The World的情况?
    Go语言没有像Java一样的JVM虚拟机,那它是编译的时候把垃圾回收、协程管理等相关的代码都编译进去了吗?每个Go的二进制包中都存在这些指令吗?
    4
  • 2019-11-20
    为什么加上runtime.GC()这句后,依然还是会读取缓存?

    func main() {
        pool := &sync.Pool{
            New: func() interface{}{
                fmt.Println("create a new object")
                return 100
            },
        }

        v,ok := pool.Get().(int)
        fmt.Println(v,ok)
        pool.Put(3)    
        runtime.GC()
        v,ok = pool.Get().(int)
        fmt.Println(v,ok)
    }

    运行结果:
    create a new object
    100 true
    3 true
    展开

    作者回复: 你使用的是那个版本呢?
    官方Go runtime 1.13将对sync.Pool中的对象回收时机策略做出调整。在1.12版本及以前的版本中,在每轮垃圾回收过程中,每个sync.Pool实例中的所有缓存对象都将被无条件回收掉。从1.13版本开始,如果一个sync.Pool实例在上一轮垃圾回收过程结束之后仍然被使用过,则其中的缓存对象将不会被回收掉。此举对于使用sync.Pool来提升效率的程序来说,将大大减少周期性的因为缓存被清除而造成的瞬时效率下降。

    1
    1
  • 2019-04-03
    请教一下老师在初始化sync.pool中那个New:func() 是什么写法呢,之前好像没遇到过

    作者回复: 这个就是在函数课程中提到,方法在Go中方法是第一公民,所以New是结构体中一个变量,而这个变量的值是个方法。这里你把自定义的方法作为变量值付给了New

    1
  • 2019-09-05
    新发布的go1.13版本中,pool支持跨GC了。
    原文是:Pool no longer needs to be completely repopulated after every GC. It now retains some objects across GCs, as opposed to releasing all objects, reducing load spikes for heavy users of Pool.
  • 2019-08-18
    老师所说的每个processor的私有对象和共享池应该就是pool源码的这两个字段定义

    // Local per-P Pool appendix.
    type poolLocalInternal struct {
        private interface{} // Can be used only by the respective P.
        shared poolChain // Local P can pushHead/popHead; any P can popTail.
    }
    展开
  • 2019-08-08
    在go doc中这样描述:A Pool is safe for use by multiple goroutines simultaneously. 并没有提及共享池的协程不安全。请问老师,如何理解pool是否协程安全?

    作者回复: 其实在我的总结里提到了,sync.Pool是可以在多协程的情况下使用的,但是在访问共享池时,会有锁的开销。

    -协程安全,会有锁的开销

  • 2019-04-19
    视频内容点到为止,每次听了还要去搜索各种资源来加深理解,希望老师给提供一些更恰当的、提供思考方向、更具实战的例子。