从萨拉玛的错误频道中读取的正确方法是什么?

时间:2018-02-01 15:07:56

标签: go goroutine sarama

当我生成消息时,我正在使用Go中编写的Sarama库来读取错误通道。整个代码看起来像这个包含在函数中:

/*
function count(objectValues){
    var count = 0;
    objectValues.forEach(elt => count += Object.values(elt).length + Object.keys(elt).length);
    return count;
} */
function countrec(objectValues){
        if(typeof objectValues !== "object"){
            return 1;
        }
        var count = Object.keys(objectValues).length;
        Object.values(objectValues).forEach(elt => count += countrec(elt));
        return count;
    }

    var jsonArray = {
        '-1': { '-1': 'b', '2': 'a', '10': 'c' }, '2': { '-1': 'a', '2': 'b', '10': 'a' }, '5': { '-1': 'a', '2': 'a', '10': 'b' } 
    };
    
    console.log(countrec(jsonArray));

随着我对常规程序的理解,我的常规程序将继续迭代producer.AsyncProducer.Input() <- &sarama.ProducerMessage{Topic: topic, Key: nil, Value: sarama.ByteEncoder(message)} go func() { for err := range saramaProducer.Errors() { if producer.callbacks.OnError != nil { producer.callbacks.OnError(err) } } }() 通道,直到它收到一个。一旦我的功能执行完毕,有没有办法让它停止侦听错误?

1 个答案:

答案 0 :(得分:1)

您可以使用其他频道和select来循环返回。

var quit chan struct{}
go func() {
    for {
        select {
        case err:=<-saramaProducer.Errors():
            //handle errors
        case <-quit:
            return
        }
    }
}
defer func() { quit<-struct{}{} }()

orignal for ... range循环不会迭代通道,直到它获得一个。相反,它会阻塞,直到遇到错误,处理它,然后再次等待新错误,直到通道关闭或main返回。

上面的代码存在一些问题,即quit和错误通道已准备好,select随机选择一个,因此可能导致单个错误丢失。如果值得处理,只需将switchdefault放在一起,即可获得该错误,然后return

相关问题