登录
首页 >  Golang >  Go问答

如何获得所有结果而不出现死锁错误

来源:stackoverflow

时间:2024-04-18 15:00:35 455浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《如何获得所有结果而不出现死锁错误》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

应该从切片中获取所有值,而最终不会出现死锁。当我不使用 waitgroups 时,我不会收到死锁错误。 <-time.after(time.second) 是我用的而不是 waitgroup,这有帮助

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {
    c := make(chan int)

    a := []int{1, 3, 10, 8, 15, 23}

    wg.Add(len(a))

    go func(i []int) {
        for _, v := range i {
            c <- v
        }
    }(a)

    go Print(c)
    wg.Wait()
}

func Print(c chan int) {
    for v := range c {
        fmt.Println(v)
    }
    wg.Done()
    close(c)
}

解决方案


您对同步机制感到困惑。重点是同步异步工作人员。不是他们将处理的元素数量。

您不是在写入结束后关闭通道,而是在读取应该结束后关闭通道。这是错误的。

您正在使生产者和消费者异步。有点奇怪。由于您在 main 中已经有一个线程,因此您可以利用它来不启动虚假例程。

修复后代码的一些变化

package main

import (
    "fmt"
    "sync"
)

var wg sync.waitgroup

func main() {
    c := make(chan int)

    a := []int{1, 3, 10, 8, 15, 23}

    wg.add(1) // one async worker
    go print(c) // ensure the worker is started upfront

    for _, v := range a {
        c <- v // write the data
    }
    close(c) //then close

    wg.wait()
    fmt.println("done")
}

func print(c chan int) {
    for v := range c { // the loop will break because the channel is closed.
        fmt.println(v)
    }
    wg.done()
}

您也可以在没有任何等待组的情况下构建它。

package main

import (
    "fmt"
)

func main() {
    c := make(chan int)

    a := []int{1, 3, 10, 8, 15, 23}

    go func() {
        for _, v := range a {
            c <- v // write the data
        }
        close(c) //then close
    }()

    for v := range c { // the loop will break because the channel is closed.
        fmt.Println(v)
    }
    fmt.Println("done")
}

本篇关于《如何获得所有结果而不出现死锁错误》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>