首页  >  文章  >  后端开发  >  将 Goroutines 的结果收集到切片中时如何避免死锁?

将 Goroutines 的结果收集到切片中时如何避免死锁?

Patricia Arquette
Patricia Arquette原创
2024-11-12 05:59:01512浏览

How to Avoid Deadlock When Gathering Results from Goroutines into a Slice?

将 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn