登录
首页 >  Golang >  Go问答

循环传输通道的值到另一个通道

来源:stackoverflow

时间:2024-02-08 16:42:24 239浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《循环传输通道的值到另一个通道》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

任何人都可以检查我的代码并检查为什么我面临死锁吗?

package main

import (
    "fmt"
    "sync"
)

func main() {

    myCh := make(chan int, 10)
    wg := &sync.WaitGroup{}

    wg.Add(10)

    // READ ONLY
    go func(ch <-chan int, wg *sync.WaitGroup) {
        value := <-myCh
        fmt.Println(value)
        wg.Done()
    }(myCh, wg)

    // send ONLY
    go func(ch chan<- int, wg *sync.WaitGroup) {
        for i := 0; i < 10; i++ {
            myCh <- i
        }
        wg.Done()
    }(myCh, wg)

    wg.Wait()
}

我想从 send channel 发送循环值,而 other channel 应该只接收每次迭代的值。


正确答案


您的阅读器 go 例程在第一次接收到数据后退出。您必须在其中包含一个 for 循环才能连续读取该通道。

其次,您不需要在外循环中调用 wg.sync(),因为它也会减少等待组。

package main

import (
    "fmt"
    "sync"
)

func main() {
    myCh := make(chan int, 10)
    wg := &sync.WaitGroup{}
    
    wg.Add(10)
    
    // READ ONLY
    go func(ch <-chan int, wg *sync.WaitGroup) {
        for value := range myCh { // this loop will read the channel continously
            fmt.Println(value)
            wg.Done()
        }
    }(myCh, wg)
    
    // send ONLY
    go func(ch chan<- int, wg *sync.WaitGroup) {
        for i := 0; i < 10; i++ {
            myCh <- i
        }
        //      wg.Done() <- This not needed here
    }(myCh, wg)
    
    wg.Wait()
    fmt.Println("DONE")
}

您在 wg.add(10) 中添加 delta = 10,并且仅调用 wg.done() 两次。

您应该调用 wg.add(2) 或调用 wg.done() 十次。

现在主函数锁定在 wg.wait() 并等待另外 8 个 wg.done() 调用。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《循环传输通道的值到另一个通道》文章吧,也可关注golang学习网公众号了解相关技术文章。

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