go - 从多个 go 例程中获取响应到一个数组中
问题描述
我需要从多个 go 例程中获取响应并将它们放入一个数组中。我知道可以为此使用通道,但是我不确定如何确保所有 go 例程都已完成对结果的处理。因此,我正在使用等待组。
代码
func main() {
log.Info("Collecting ints")
var results []int32
for _, broker := range e.BrokersByBrokerID {
wg.Add(1)
go getInt32(&wg)
}
wg.Wait()
log.info("Collected")
}
func getInt32(wg *sync.WaitGroup) (int32, error) {
defer wg.Done()
// Just to show that this method may just return an error and no int32
err := broker.Open(config)
if err != nil && err != sarama.ErrAlreadyConnected {
return 0, fmt.Errorf("Cannot connect to broker '%v': %s", broker.ID(), err)
}
defer broker.Close()
return 1003, nil
}
我的问题
如何将所有响应 int32(可能返回错误)放入我的 int32 数组中,以确保所有 go 例程都已完成处理工作并返回错误或 int?
解决方案
如果您不处理作为 goroutine 启动的函数的返回值,它们将被丢弃。请参阅从 goroutine 返回值会发生什么。
您可以使用切片来收集结果,其中每个 goroutine 可以接收将结果放入的索引,或者元素的地址。请参阅我可以同时编写不同的切片元素。请注意,如果您使用它,则必须预先分配切片,并且只能写入属于 goroutine 的元素,您不能“触摸”其他元素,也不能附加到切片。
或者您可以使用一个通道,goroutines 在该通道上发送包含它们处理的项目的索引或 ID 的值,因此收集 goroutine 可以识别或排序它们。请参阅如何从按特定顺序执行的 N 个 goroutine 收集值?
如果处理应该在遇到第一个错误时停止,请参阅Close multiple goroutine if an error in one in go
这是一个使用频道时的示例。请注意,这里不需要等待组,因为我们知道我们希望通道上的值与我们启动的 goroutine 一样多。
type result struct {
task int32
data int32
err error
}
func main() {
tasks := []int32{1, 2, 3, 4}
ch := make(chan result)
for _, task := range tasks {
go calcTask(task, ch)
}
// Collect results:
results := make([]result, len(tasks))
for i := range results {
results[i] = <-ch
}
fmt.Printf("Results: %+v\n", results)
}
func calcTask(task int32, ch chan<- result) {
if task > 2 {
// Simulate failure
ch <- result{task: task, err: fmt.Errorf("task %v failed", task)}
return
}
// Simulate success
ch <- result{task: task, data: task * 2, err: nil}
}
输出(在Go Playground上试试):
Results: [{task:4 data:0 err:0x40e130} {task:1 data:2 err:<nil>} {task:2 data:4 err:<nil>} {task:3 data:0 err:0x40e138}]
推荐阅读
- javascript - 在 Angular 的错误消息中打印字符串消息
- django - 使用 Django Rest + Djoser 返回的不仅仅是 Auth Token?
- android-studio - qemu-system-x86_64.exe':无效参数 3:06 PM 模拟器:进程以退出代码 22 完成
- asp.net-core-3.0 - ConfigureWebHostDefaults 的 Asp.Net Core 3 源代码在哪里?
- project-reactor - 带有短路选项的 Flux.concatDelayError
- devops - 哨兵问题未链接到源地图
- javascript - Convert SQL date number into date using javascript
- javascript - Cloudflare 阻止我访问我的 wordpress 网站,因为我试图从 zoho 聊天插件中添加 javascript 代码片段
- aggregate - Tableau 计算的最低级别字段聚合 SUM 和所有其他字段的最小值
- javascript - JSON.stringify 如何自动将 moment 对象转换为 iso 字符串?