你的目标是利用 Go 中的 Goroutines 并行处理项目,收集它们的结果切成片。然而,您遇到了一个令人困惑的死锁错误:“all goroutine are sleep - deadlock!”
该错误源于代码中的两个问题:
要纠正这些问题,引入一个 goroutine,在工作线程完成时异步关闭通道:
for i, line := range contents { wg.Add(1) go newSample(line, *replicatePtr, *timePtr, sampleChan, &wg) } go func() { wg.Wait() close(sampleChan) }() for s := range sampleChan { .. }
如果您需要固定数量的工作人员以获得最佳效率,请按如下方式重构代码:
for i, line := range contents { wg.Add(1) go func(line string) { defer wg.Done() sampleChan <- newSample(line, *replicatePtr, *timePtr) }(line) }
这将并发原语保持在一起并简化了各种并发模式的重构。
以上是使用 Goroutines 进行并行处理和结果收集时如何避免死锁?的详细内容。更多信息请关注PHP中文网其他相关文章!