登录
首页 >  Golang >  Go问答

Goroutine 通道发送数据直到等待组完成

来源:stackoverflow

时间:2024-04-11 11:24:38 375浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Goroutine 通道发送数据直到等待组完成》,涉及到,有需要的可以收藏一下

问题内容

我的模块中有一个长时间运行的 go 例程,直到程序结束才完成。

我有一个 for 循环,它会生成输入通道的其他例程。

代码很庞大,因此这里是一个基本上执行相同操作的示例。

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    channel := someFunc()
    //unrelated routine
    go func() {
        time.Sleep(1000 * time.Hour)

    }()
    for resp := range channel {
        fmt.Println(resp)
    }

}

func someFunc() chan int {
    var wg sync.WaitGroup
    t := make(chan int, 10)
    arr := []int{1, 2, 3, 4, 5, 6, 7, 8}
    for _, i := range arr {
        wg.Add(1)

        go func(i int) {
            defer wg.Done()
            time.Sleep(time.Duration(i) * time.Second)

            t <- i

        }(i)
    }
    wg.Wait()
    close(t)
    return t
}

删除等待组和 close() (没有这会导致程序永远运行)会导致程序永远运行,但让它们阻塞通道,直到所有例程完成。如何在不让程序无限期运行的情况下向通道发送数据?

ps:长时间运行的例程位于我无法控制的导入模块中。


正确答案


最好的方法是添加另一个 go 例程。这允许程序异步等待关闭程序。

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    channel := someFunc()
    //unrelated routine
    go func() {
        time.Sleep(1000 * time.Hour)

    }()
    for resp := range channel {
        fmt.Println(resp)
    }

}

func someFunc() chan int {
    var wg sync.WaitGroup
    t := make(chan int, 10)
    arr := []int{1, 2, 3, 4, 5, 6, 7, 8}
    for _, i := range arr {
        wg.Add(1)

        go func(i int) {
            defer wg.Done()
            time.Sleep(time.Duration(i) * time.Second)

            t <- i

        }(i)
    }
    go func() {
        defer close(t)

        wg.Wait()

    }()
    return t
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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