goroutine泄漏与上下文超时?

时间:2018-06-06 20:53:51

标签: go channel goroutine

在下面的代码中,客户端在服务的输入通道上放置一个字符串,并在输出或错误通道上侦听回复。

上下文设置为5ms超时。

func (s service) run() {
    <-s.input

    go func() {
        select {
        case <-s.ctx.Done():
            s.errs <- errors.New("ctx done")
            return
        }
    }()

    time.Sleep(10 * time.Millisecond)
    s.output <- 42
    fmt.Println("run exit")
}

代码超时正确(由于10ms睡眠)和输出

error:  ctx done

然而,&#34;运行退出&#34>从未打印过。

问题:是否存在goroutine泄漏且进程停留在

s.output <- 42

Go Playground示例

1 个答案:

答案 0 :(得分:0)

上下文的超时时间为5毫秒,运行此行s.output <-42之前您要睡眠10毫秒。因此上下文首先是超时,然后发生错误,这种错误是正确的,但请看一下main函数:

select {
    case o := <-s.output:
        fmt.Println("output: ", o)
    case err := <-s.errs:
        fmt.Println("error: ", err)
    }

select语句已达到情况err := <-s.errs,因此它将中断选择并转到main函数的末尾=>程序退出 即使s.output <- 42s.errs <- errors.New("ctx done")同时调用,select语句中也只有一种情况,如果需要达到第二种情况,请在select语句周围放一个循环