0

当我生成消息时,我正在使用用 Go 编写的 Sarama 库从错误通道中读取。整个代码如下所示,包含在一个函数中:

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)
        }
    }
}()

正如我对 goroutines 的理解一样,我的 goroutines 会在通道上不断迭代,Errors()直到它收到一个。一旦我的函数执行完毕,有没有办法让它停止监听错误?

4

1 回答 1

1

您可以使用另一个通道和 aselect使循环返回。

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

原始for ... range循环在获得一个之前不会迭代通道。相反,它会阻塞,直到它得到一个错误,处理它,并再次等待一个新的错误,直到通道关闭或main返回。

There is a little problem about the above code, that owhen both quit and error channel is ready, the select picks one randomly, thus may cause a single error loss. If this is worth handling, just put another switch with default to get that error and then return.

于 2018-02-01T15:57:50.620 回答