docker代码探究 函数queue探究

今天探究 DOCKER 的源码,发现了一段有意思代码,探究了一会,将结果记录下来

代码目的

docker daemon 接受来自containerd 的grpc消息,并针对依次处理。这段代码出自依次处理过程;

代码:

//libcontainer/container_linux.go
type queue struct {
    sync.Mutex
    fns map[string]chan struct{}
}

func (q *queue) append(id string, f func()) {
    q.Lock()
    defer q.Unlock()

    if q.fns == nil {
        q.fns = make(map[string]chan struct{})
    }

    done := make(chan struct{})

    fn, ok := q.fns[id]
    q.fns[id] = done
    go func() {
        if ok {
            <-fn //等待对端关闭channel
        }
        f()
        close(done)//关闭channel后,在另外一端的读操作,不在阻塞
    }()
}

上述queue的append的代码设计目的:
1. 使用q的sync.Mutex属性,实现互斥,避免竞争
2. 在处理func()函数时,启用了协程加快func() 处理速度,避免func() 业务复杂时,阻塞于此处
3. 在go中,协程的执行顺序没有先后顺序,所以添加了channel来保证同 id 的协程按照先进先执行的顺序执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值