golang context 小记

Hello · · 267 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

// propagateCancel arranges for child to be canceled when parent is.
func propagateCancel(parent Context, child canceler) {
    if parent.Done() == nil {
        return // parent is never canceled
    }
    if p, ok := parentCancelCtx(parent); ok {
        p.mu.Lock()
        if p.err != nil {
            // parent has already been canceled
            child.cancel(false, p.err)
        } else {
            if p.children == nil {
                p.children = make(map[canceler]struct{})
            }
            p.children[child] = struct{}{}
        }
        p.mu.Unlock()
    } else {
   // 开始不太理解这里:
   // 1.在cancel函数里会主动的将所有child cancel掉,为何还要这个协程来进行cancel。
   // 2.为何还要监听 child.Done().
   // 解答:
   // 1. 注意下这里的if else 结构,能走到这里的条件是,向上查找父context的过程中,没有发现cancleCtx的context。而只有cancelCtx有cancel函数。没有cancel函数的话,只能这样用协程的方式监听Done()了。
   // 2.监听child.Done()是因为child执行结束或被cancel的时候,这个协程就可以退出了,没必要等parent结束。
        go func() {
            select {
            case <-parent.Done():
                child.cancel(false, parent.Err())
            case <-child.Done():
            }
        }()
    }
}

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:Hello

查看原文:golang context 小记

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

267 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传