首页 > 解决方案 > 选择块如何等待 ctx.Done() 操作?

问题描述

在下面的代码中:

    ctx, cancel := context.WithTimeout(req.Context(), 5000*time.Second)

    // Wait for the response or timeout
    select {
    case <-ctx.Done():
        log.Println("timeout, cancel work...")

        // Cancel the request and wait for it to complete
        // this will shutdown the go-routine immediately
        tr.CancelRequest(req)
        log.Println(<-ch)

    case err := <-ch:
        // do something
    }

select同时等待两个接收操作。一个接收操作(<-ch)是一个块操作

在块的执行中select,是否ctx.Done()在块中多次调用select以验证是否ctx.Done()返回通道?直到<-ch被封锁...

标签: go

解决方案


规范:选择语句:

对于语句中的所有情况,在输入“select”语句时,接收操作的通道操作数以及发送语句的通道和右侧表达式仅按源顺序计算一次

select只调用ctx.Done()一次。它返回一个通道,并监视来自该通道的接收操作是否可以继续。

如果超时过期,5000*time.Second或者父上下文req.Context()(不再)。规格:接收运算符:cancel()ctx.Done()

关闭通道上的接收操作总是可以立即进行,在接收到任何先前发送的值之后产生元素类型的零值。


推荐阅读