V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
shhch
V2EX  ›  Go 编程语言

golang context 的相关使用

  •  
  •   shhch · 2020-11-23 16:45:27 +08:00 · 3354 次点击
    这是一个创建于 1221 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,之前的项目中没有使用 context,高并发的场景下,日志都难以定位问题,于是准备在所有逻辑函数中加上 context (工作量有点大),并为每次请求带上 id 标识;

    但是除此之外就没有其他作用了,就有点怀疑是否有必要;

    有没有大佬介绍下实际中的其他使用场景和方式?( With 系列目前也没有发现有什么使用场景...)

    第 1 条附言  ·  2020-11-25 16:35:46 +08:00
    看了下大家的回复,使用上用做 traceID 应该是比较常见的,其他功能暂时没有的场景;
    同时,在主要入口函数处还是可以加上 ctx 往下传递作为预留使用
    34 条回复    2020-12-21 20:46:00 +08:00
    realbender
        1
    realbender  
       2020-11-23 17:26:50 +08:00
    一般可以用来作为网络 io 调用的超时功能,你的需求可能需要在 log 打印中携带一些上下文信息,不一定要用 context
    shhch
        2
    shhch  
    OP
       2020-11-23 17:39:23 +08:00
    @realbender 现在是没有使用到 context 的,有没有必要在逻辑函数里加上 context 参数往后传递,方便后续扩展使用
    xkeyideal
        3
    xkeyideal  
       2020-11-23 17:41:31 +08:00   ❤️ 1
    没人使用 context 做 traceid 的事情,context 主要用途是控制子 goroutine 的存活,你的需求可以采用 WithOption 的方式
    eudore
        4
    eudore  
       2020-11-23 17:50:11 +08:00
    http 的封装下就好,rpc 有全链路日志就是 context 传递
    cloverstd
        5
    cloverstd  
       2020-11-23 18:08:33 +08:00
    @xkeyideal 我们用了...
    rhtututu
        6
    rhtututu  
       2020-11-23 18:10:56 +08:00
    @xkeyideal 我们也用了...
    yzbythesea
        7
    yzbythesea  
       2020-11-23 18:22:44 +08:00
    @xkeyideal 我们还是用了...
    xkeyideal
        8
    xkeyideal  
       2020-11-23 18:34:15 +08:00
    @cloverstd 为了明确数据类型,我们不使用 context
    shhch
        9
    shhch  
    OP
       2020-11-23 19:15:34 +08:00
    那有没有必要全部加上 context 字段往下传递,作为后续预留使用?
    cyrivlclth
        10
    cyrivlclth  
       2020-11-23 19:38:05 +08:00
    @xkeyideal 我们也用了。。。
    @shhch 加 context 这个工作量还好吧,前不久刚加过,用 goland 重构功能一下就加好了。。。
    Exceptions
        11
    Exceptions  
       2020-11-23 19:40:27 +08:00
    @xkeyideal 都用的好吧,第一个参数就是 context,无限传递
    ylsc633
        12
    ylsc633  
       2020-11-23 20:02:38 +08:00
    我们也用了 context 传 traceid

    主要是项目是新写的, 日志和方法第一个参数都是 ctx

    好处就是 性能好很多, 弊端就是有点蠢..

    如果老项目,可以用代码无侵入的方法,不过性能有点问题..
    securityCoding
        13
    securityCoding  
       2020-11-23 20:08:07 +08:00
    @xkeyideal 233 ,我们都在用
    cloudzhou
        14
    cloudzhou  
       2020-11-23 20:12:22 +08:00
    @xkeyideal trace id 通过 context 传递,这简直是基本操作阿
    PiersSoCool
        15
    PiersSoCool  
       2020-11-23 20:15:16 +08:00
    context 写定时任务,withCancel 在 gracefully shutdown 的时候很好用,监听 <-ctx.Done() 或者 <-ticker.C (继续),再用一个 channel 监听定时任务完成的消息,外层调用 cancel 等待 channel 返回数据就好

    with 时间的就不多说了

    而且没必要在所有函数加上 Context,几个关键入口就知道谁有问题了吧
    GopherDaily
        16
    GopherDaily  
       2020-11-23 20:56:33 +08:00   ❤️ 1
    At Google, we require that Go programmers pass a Context parameter as the first argument to every function on the call path between incoming and outgoing requests.

    建议是所有的函数的第一个都带上。
    作用有几个:
    cancel, timeout, trace
    lewinlan
        17
    lewinlan  
       2020-11-23 23:31:19 +08:00 via Android
    涨姿势了……
    我以为在所有地方传递 ctx 很傻叉……
    看到大家都这样我就放心了:)
    lxml
        18
    lxml  
       2020-11-23 23:50:26 +08:00
    @xkeyideal #3 用了 + 1 用 context 传递 traceId 是主流操作……
    tiedan
        19
    tiedan  
       2020-11-23 23:52:26 +08:00
    我们也是 context 传 traceId 哈哈
    K4
        20
    K4  
       2020-11-24 00:01:17 +08:00 via iPhone
    @shhch 管他三七二十一,接口设计的时候就加上,用不用再说,说不定什么时候就用上了呢?😄
    unixeno
        21
    unixeno  
       2020-11-24 01:07:37 +08:00 via Android
    trace,管理 go routine (控制超时什么的)
    应该主要就这两个用了,其实就是个上下文环境了
    dingyaguang117
        22
    dingyaguang117  
       2020-11-24 09:07:20 +08:00 via iPhone
    哈哈 tornado 单线程我们使用 contextvar
    Flask 使用 threadlocal

    Go 随时起 性能好 不过 ctx 用起来麻烦了点
    v2Geeker
        23
    v2Geeker  
       2020-11-24 09:19:19 +08:00 via iPhone
    @xkeyideal 我们也用了。context 非常适合。
    yuyoung
        24
    yuyoung  
       2020-11-24 09:29:23 +08:00
    @xkeyideal 额,我好像是这么用的,这里有什么设计问题吗?
    shhch
        25
    shhch  
    OP
       2020-11-24 09:39:45 +08:00
    @K4 没毛病,全加上,用不用再说_(:з」∠)_
    tairan2006
        26
    tairan2006  
       2020-11-24 10:37:15 +08:00
    cxt 的设计其实非常简单粗暴…这也是不如 java 的地方,很多时候没法对代码无侵入。
    snowwalf
        27
    snowwalf  
       2020-11-24 11:11:52 +08:00
    我们也是 context 传 tracerid,接入 http server/client,实现多服务全链路串联;另外 context 里带上 stack,实现模块调用堆栈打点
    mooyo
        28
    mooyo  
       2020-11-24 12:35:53 +08:00 via iPhone
    我们也用了,不太理解不用 ctx 要怎么做链路的追踪
    TypeErrorNone
        29
    TypeErrorNone  
       2020-11-24 14:18:31 +08:00
    主要用来传参
    shhch
        30
    shhch  
    OP
       2020-11-24 14:30:41 +08:00
    @mooyo +1
    @snowwalf 大佬,堆栈打点具体是怎么做的啊
    cyrivlclth
        31
    cyrivlclth  
       2020-11-26 09:29:39 +08:00
    @lewinlan
    @tairan2006 个人认为 go 的话显式比隐式好...
    tairan2006
        32
    tairan2006  
       2020-11-26 19:33:48 +08:00
    @cyrivlclth 侵入性太强了,以前的 code base 大的话根本改不动
    snowwalf
        33
    snowwalf  
       2020-11-29 17:46:33 +08:00
    @shhch 就是 context.WithValue 带个自定义的调用栈信息,先进先出,实现调用函数链的追踪
    cyrivlclth
        34
    cyrivlclth  
       2020-12-21 20:46:00 +08:00
    @tairan2006 我是觉得业务代码就别提什么侵入性了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4129 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:26 · PVG 13:26 · LAX 22:26 · JFK 01:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.