Golang: Interview Question: Programming: Concurrency 1

12th January 2022 at 2:40pm

对于这样的代码:

package main

import (
    "context"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().UnixNano())
    
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()

    Run(ctx)
}

func Run(ctx context.Context) {
}

func SlowOperation() {
    n := rand.Intn(3)
    time.Sleep(time.Duration(n) * time.Second)
}

要求仅编辑 Run 函数,实现:

  1. Run 必须要调用 SlowOperation 函数
  2. Run 函数在 ctx 超时后必须立刻返回
  3. 如果 SlowOperation 结束的比 ctx 快,也立刻返回

进阶问题:

有什么场景适合使用这段代码吗?
一个服务在接受请求时可能会调用多个服务,但它的也需要控制整体的时间消耗。它需要用这种写法来实现。

这段代码有什么不足之处?
假如 ctx 超时导致 Run 返回,此时 SlowOperation 还在执行,并没有被马上中断。