doukao5073 2018-12-07 21:23
浏览 220
已采纳

了解Golang上下文超时

I am having trouble understanding how I can check if context exceeded deadline set by timeout, or if I should check at all?

This is a snippet from mongo-go-driver:

client, err := NewClient("mongodb://foo:bar@localhost:27017")
if err != nil { return err }
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
defer cancel()
err = client.Connect(ctx)
if err != nil { return err }

Reading this code, how do I know if context exceeded deadline? From what I naively understand (or not understand), the line err = client.Connect(ctx) will give me error including deadline exceeded (if exceeded), thus I think I don't even need to explicitly check?

But then while looking around the internet to better understand how contexts work, I come across uses of select cases which explicitly checks contexts as below (code snippet from http://p.agnihotry.com/post/understanding_the_context_package_in_golang/):

//Use a select statement to exit out if context expires
  select {
  case <-ctx.Done():
    fmt.Println("sleepRandomContext: Time to return")
  case sleeptime := <-sleeptimeChan:
    //This case is selected when processing finishes before the context is cancelled
    fmt.Println("Slept for ", sleeptime, "ms")
  }

Should I be explicitly checking for it? If not, when should I use explicit checks? Thank you for your time and help!

  • 写回答

2条回答 默认 最新

  • doupu5941 2018-12-07 21:38
    关注

    The select code in the second part of your question is what the code in the Connect method might look like. There it is checking whether the ctx.Done() is ready to send. If it is, then the context was cancelled either because the timeout occurred, or because cancel() was called.

    errors are values. Treat them as such. If it is important for you to understand the cause of the error (network down? unexpected data? timeout?) then you should do the check and act accordingly. If recovery from the error regardless of the cause is the same, then checking the error is not as important.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 luckysheet
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误