gpt4 book ai didi

go - 将来自多个 go routines 的响应获取到一个数组中

转载 作者:IT王子 更新时间:2023-10-29 02:35:42 25 4
gpt4 key购买 nike

我需要从多个 go 例程中获取响应并将它们放入一个数组中。我知道 channel 可用于此目的,但我不确定如何确保所有 go 例程都已完成结果处理。因此,我正在使用 WaitGroup 。

代码

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 启动的函数的返回值,它们将被丢弃。参见 What happens to return value from goroutine .

您可以使用 slice 来收集结果,其中每个 goroutine 都可以接收用于放置结果的索引,或者元素的地址。参见 Can I concurrently write different slice elements .请注意,如果您使用它,则必须预先分配 slice ,并且只能写入属于 goroutine 的元素,您不能“触摸”其他元素,也不能附加到 slice 。

或者您可以使用一个 channel ,goroutines 在该 channel 上发送包含它们处理的项目的索引或 ID 的值,以便收集 goroutine 可以识别或排序它们。参见 How to collect values from N goroutines executed in a specific order?

如果处理应在遇到第一个错误时停止,请参阅 Close multiple goroutine if an error occurs in one in go

这是一个使用 channel 时的示例。请注意,这里不需要 WaitGroup ,因为我们知道我们希望 channel 上的值与我们启动的 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 上尝试 ot):

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}]

关于go - 将来自多个 go routines 的响应获取到一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54534588/

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