将 Goroutines 的结果收集到切片中
利用 Goroutine 并发处理数据并收集结果可能具有挑战性,特别是在管理并发和线程时安全。在您的代码中,您遇到了死锁错误,因为 waitgroup 收到信号,要求等待所有 goroutine 完成后再收集结果。
要解决此问题,我们需要在所有 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 { // Process results }
此更改可确保当所有 goroutine 完成时关闭结果通道,使我们能够正确收集结果。
此外,为了增强为了代码清晰性和可测试性,建议将 newSample 重构为生成结果的同步函数,而不是采用 waitgroup 和通道。这可以更清晰地分离并发问题并简化测试。
通过实施这些调整,您可以有效地从 Goroutine 收集结果并避免死锁错误。
以上是将 Goroutines 的结果收集到切片中时如何避免死锁?的详细内容。更多信息请关注PHP中文网其他相关文章!