gpt4 book ai didi

go - 从 Sarama 的错误 channel 中读取的正确方法是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:11 26 4
gpt4 key购买 nike

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

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

根据我对 go 例程的理解,我的 go 例程会不断迭代 Errors() channel ,直到它收到一个错误。有没有办法让它在我的函数执行完毕后停止监听错误?

最佳答案

您可以使用另一个 channel 和一个 select 来使循环返回。

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

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

上面的代码有个小问题,就是当quit和error channel都准备好了的时候,select会随机选择一个,这样可能会导致一个error loss .如果这值得处理,只需将另一个 switch 设置为 default 以获取该错误,然后 return

关于go - 从 Sarama 的错误 channel 中读取的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48565920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com