登录
首页 >  Golang >  Go问答

聚合多个消息并发送到一个 Go 通道

来源:stackoverflow

时间:2024-02-15 10:39:23 321浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《聚合多个消息并发送到一个 Go 通道》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我正在努力集中注意力。我想制作一个简单的程序,基本上

  1. 启动一堆 go 例程
  2. 处理消息
  3. 将处理结果发送到通道
  4. 让主线程收集这些结果
  5. 关闭。

看起来很简单。我一开始就毫无逻辑可言。我只是发送一个号码并尝试取回该号码。

问题:我陷入僵局,我不知道为什么。我认为我可能会误用带有通道的等待组,因为它们单独工作,但我不确定如何让主线程阻塞任意数量的启动的 go 例程。

package main

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

func main() {
    queue := make(chan int)
    start := time.Now()
    var wg sync.WaitGroup

    for i := 0; i < 10; i += 1 {
        wg.Add(1)
        go count(i, queue, &wg)
    }

    wg.Wait()

    for value := range queue {
        println(value)
    }

    close(queue)

    fmt.Println(time.Now().Sub(start))
    // fmt.Println(summation)
}

func count(number int, queue chan int, wg *sync.WaitGroup) {
    defer wg.Done()

    fmt.Println("Starting ", number)
    queue <- number
    fmt.Println("ending")

}

解决方案


你的 goroutine 在 queue <- number 上阻塞,因为 queue 是一个无缓冲通道,没有人从中读取,作为 wg.Wait 上的主要块。

queue 声明为缓冲通道。例如: queue := make(chan int, 10)

来自 Go Tour (concurrency) 及后续页面:

或者,将 wg.Wait 移到 for v := range queue 循环之后。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

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