当创建类似“ reloadCh chan chan error”的频道时,这是什么意思

时间:2018-07-12 03:32:47

标签: go channel prometheus

我是golang的新手,开始根据prometheus client-go编写一些监视器导出程序,发现promethues的源代码具有通道var的定义代码

reloadCh     chan chan error

并使用

实例化它
reloadCh:    make(chan chan error)

通常,可以使用

定义一个通道
reloadCh     chan error

为什么这里有额外的chan

1 个答案:

答案 0 :(得分:2)

chan chan error是错误通道。使用通道的通道的一种常见应用是获得对请求的响应或错误(实际上,您正在查看的普罗米修斯出口商就是这种情况)。使用通道通道的原因是,它允许您选择要将答案传达到的位置(与使用同一通道发送请求和接收响应相反)。

示例:

package main

import (
    "errors"
    "fmt"
    "math/rand"
    "time"
)

func main() {

    requestChan := make(chan chan error)

    // Starting the service goroutine
    go goroutine(requestChan)

    // Send 5 requests and collect errors
    for i := 0; i < 5; i++ {
        fmt.Printf("Request %v\n", i+1)

        // Make channel that will be used to communicate error back to main
        errorChan := make(chan error)

        requestChan <- errorChan

        err := <-errorChan
        fmt.Printf("Erro received: %v\n\n", err)

        time.Sleep(1 * time.Second)

    }
}

func goroutine(requestChan <-chan chan error) {

    for {
        select {
        case errChan := <-requestChan:
            fmt.Println("Got request from requestChan")
            errChan <- someOperation()
        }
    }
}

// someOperation that will sometimes return nil error and sometimes it will return error
func someOperation() error {

    if rand.Intn(10) > 5 {
        return nil
    }

    return errors.New("error for someOperation")
}

go playground上运行它。

Sameer Ajmani的Advanced Go Concurrency Patterns演讲中对此概念做了很好的解释。