【问题标题】:What does mean when create channel like "reloadCh chan chan error"创建像“reloadCh chan chan error”这样的频道是什么意思
【发布时间】:2018-07-12 03:32:47
【问题描述】:

我是golang新手,开始写一些基于prometheus client-go的monitor exporters,发现promethues的源码中有这样的channel var定义代码

reloadCh     chan chan error

并使用实例化它

reloadCh:    make(chan chan error)

像往常一样,可以用

定义一个通道
reloadCh     chan error

为什么会有额外的chan 在这里?

【问题讨论】:

  • chan error 是一个错误通道。 chan chan error 是一个频道频道。
  • 知道了,谢谢。这真的让我很困惑。

标签: go channel prometheus


【解决方案1】:

chan chan error 是一个错误通道。使用通道通道的常见应用之一是获得对请求的响应或错误(这实际上是您正在查看的 prometheus 导出器的情况)。使用 channel of channels 的原因是它允许您选择要将答案传达给的位置(与使用相同的频道发送请求和接收响应相反)。

一个例子:

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 演讲中对这个概念进行了很好的解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多