• Cloud
    2018-10-24
    还没用过context包的我看得一愣一愣的
    
     60
  • Spike
    2018-12-05
    https://blog.golang.org/pipelines
    https://blog.golang.org/context
    要了解context的来源和用法,建议先阅读官网的这两篇blog
    
     23
  • Li Yao
    2018-11-16
    如果能举一个实际的应用场景就更好了,这篇看不太懂用途
    
     10
  • 勉才
    2019-01-01
    context 树不难理解,context.Background 是根节点,但它是个空的根节点,然后通过它我们可以创建出自己的 context 节点,在这个节点之下又可以创建出新的 context 节点。看了 context 的实现,其实它就是通过一个 channel 来实现,cancel() 就是关闭该管道,context.Done() 在 channel 关闭后,会返回。替我们造的轮子主要实现两个功能:1. 加锁,实现线程安全;2. cancel() 会将本节点,及子节点的 channel 都关闭。
    
     8
  • 丁香与茉莉
    2018-11-30
    http://www.flysnow.org/2017/05/12/go-in-action-go-context.html
    
     7
  • 郝林
    2019-04-17
    我看不少读者都说写一篇难理解。可能的确如此,因为我假设你们已对context包有基本的了解。

    不过没关系,你们有此方面的任何问题都可以通过以下三个途径与我讨论:

    1. 直接在专栏文章下留言;
    2. 在 GoHackers 微信群或者 BearyChat 中的 GoHackers 团队空间里艾特我;
    3. 在知识星球中的 GoHackers VIP 社群里向我提问。
    展开
     2
     5
  • Timo
    2019-05-28
    Context 使用原则
    不要把Context放在结构体中,要以参数的方式传递
    以Context作为参数的函数方法,应该把Context作为第一个参数,放在第一位。
    给一个函数方法传递Context的时候,不要传递nil,如果不知道传递什么,就使用context.TODO
    Context的Value相关方法应该传递必须的数据,不要什么数据都使用这个传递
    Context是线程安全的,可以放心的在多个goroutine中传递
    展开
    
     4
  • 憶海拾貝
    2018-11-15
    服务间调用通常要传递上下文数据,用带值Context在每个函数间传递是一种方式,但从Python过来的我觉得这对代码侵入性蛮大的。请问go中还有什么更好的办法传递上下文数据呢?
    
     2
  • Geek_f39659
    2019-11-08
    根据这句话:“A great mental model of using Context is that it should flow through your program. Imagine a river or running water. This generally means that you don’t want to store it somewhere like in a struct. Nor do you want to keep it around any more than strictly needed. Context should be an interface that is passed from function to function down your call stack, augmented as needed.”

    感觉上Context设计上更像是一个运行时的动态概念,它更像是代表传统call stack 层层镶套外加分叉关系的那颗树。代表着运行时态的调用树。所以它最好就是只存在于函数体的闭包之中,大家口口相传,“传男不传女”。“因为我调用你,所以我才把这个传给你,你可以传给你的子孙,但不要告诉别人!”。所以最好不要把它保存起来让旁人有机会看得到或用到。

    楼上有人提到这种风格的入侵性,我能理解你的感觉。但以我以前玩Node.js中的cls (continuation local storage)踩过的那些坑来看,我宁愿两害相权取其轻。这种入侵性至少是可控的,显式的。同步编程的世界我们只需要TLS(Thread local storage)就好了,但对应的异步编程的世界里玩cls很难搞的。在我来看,Context显然是踩过那些坑的老鸟搞出来的。
    展开
    
     1
  • 山分子
    2019-04-09
    cotext.backround()和cotext.todo()有什么区别

    作者回复: 很明显,context.Background()返回的是全局的上下文根(我在文章中多次提到),context.TODO()返回的是空的上下文(表明应用的不确定性)。

     1
     1
  • HOPE
    2018-11-12
    老师,请教个问题。我运行了多个goroutine,每个goroutine有不同的配置。我现在想修改运行时的goroutine的配置,使用context可以实现吗?或者可以用什么办法实现?
     1
     1
  • 属鱼
    2018-10-25
    深度优先,看func (c *cancelCtx) cancel(removeFromParent bool, err error)方法的源代码。
    
     1
  • Shawn
    2018-10-25
    看代码是深度优先,但是我自己写了demo,顺序是乱的,求老师讲解

    作者回复: 打印出来的顺序不定是正常的,因为goroutine会被实时调度啊,打印出来的顺序不一定就是真实顺序。每填语句执行完都可能被调度。

    
     1
  • 疯琴
    2019-12-29
    用文字将技术知识表达清晰是一件很不容易的事,我接触过一点WithCancel的用法,边看老师的文章边动手实践一下WithTimeout和WithDeadline这两个和WithCancel相关的Context函数,感觉阐述得很清晰。但是WithValue完全没用过,确实看起来就不太明白,但是敲一遍demo69以后再看老师的讲述就很清楚了。
    
    
  • 虢國技醬
    2019-11-27
    对着源码进行二刷
    
    
  • moooofly
    2019-09-30
    “它会向它的所有子值(或者说子节点)传达撤销信号。这些子值会如法炮制,把撤销信号继续传播下去。最后,这个 Context 值会断开它与其父值之间的关联。”--这里有一个问题,我能理解,当在这个上下文树上的某个 node 上触发 cancel 信号时,以该 node 为根的子上下文树会从原来的树上断开;而文中又提到“撤销信号在被传播时,若遇到它们(调用 context.WithValue 函数得到的 Context 值)则会直接跨过” ,那么,这些被“跨过”的 node ,在上面说的子上下文树断开的过程里,是一起断开了?还是仍旧会和更上层的 node 节点有关联?

    作者回复: 逻辑上会一起断开的。但由于 value context 本身不会去传递信号,所以实质上不用做断开操作。这几种 context 所起到的作用是不同的,所以有些专属的操作只会在对应的 context 上做。不过与它们临近的其他种类的 context 会随之联动。你看下源码就清楚了,它们不是完全“链接”在一起的,有的会紧密嵌套在一起,所以有的操作可以很自然地进行跨越式处理。

     1
    
  • 思维
    2019-09-02
    实际使用中 http.ReverseProxy经常会报 proxy error:context canceled 请问老师有哪些原因可能导致这个问题

    作者回复: 你可以说的具体一些。

    
    
  • 茴香根
    2019-07-25
    留言区很多人说Context 是深度优先,但是我在想每个goroutine 被调用的顺序都是不确定的,因此在编写goroutine 代码时,实际的撤销响应不能假定其父或子context 所在的goroutine一定先或者后结束。

    作者回复: 是的,这涉及到两个方面,需要综合起来看。

    
    
  • 闫飞
    2019-07-16
    繁衍一词的翻译有些生硬,是否能换一个好理解一些的中文词汇

    作者回复: 翻译的词?这是我找到的一个比较贴切的词。把 Context 比喻成可以繁衍后代的生物不会更容易理解一些么?

    
    
  • 后端进阶
    2019-07-04
    context包其实相当于Java的同步工具类,比如cancelFunc其实就是一个countDownLatch

    作者回复: 如果我没记错的话,还是不一样的。

    
    
我们在线,来聊聊吧