登录
首页 >  Golang >  Go问答

通道多路复用器

来源:Golang技术栈

时间:2023-04-06 09:21:56 119浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《通道多路复用器》,正文内容主要涉及到golang等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

注意 - Go 中的新手。

我编写了一个多路复用器,它 应该 将一组通道的输出合并为一个。对建设性的批评感到满意。

func Mux(channels []chan big.Int) chan big.Int {
    // Count down as each channel closes. When hits zero - close ch.
    n := len(channels)
    // The channel to output to.
    ch := make(chan big.Int, n)

    // Make one go per channel.
    for _, c := range channels {
        go func() {
            // Pump it.
            for x := range c {
                ch 

我正在测试它:

func fromTo(f, t int) chan big.Int {
    ch := make(chan big.Int)

    go func() {
        for i := f; i 

但我的输出很奇怪:

Feed: 0
Feed: 10
Feed: 20
Feed: 30
Feed: 40
Feed: 50
Feed: 60
Feed: 70
Feed: 80
Feed: 90
Feed: 91
Feed: 92
Feed: 93
Feed: 94
Feed: 95
Feed: 96
Feed: 97
Feed: 98
Feed: 99
{false [90]}
{false [91]}
{false [92]}
{false [93]}
{false [94]}
{false [95]}
{false [96]}
{false [97]}
{false [98]}
{false [99]}

所以我的问题:

  • 我在 Mux 中做错了什么吗?
  • 为什么我只能从输出通道获得最后 10 个?
  • 为什么喂食看起来如此奇怪?(每个输入通道的第一个,最后一个通道的所有通道,然后什么都没有)
  • 有没有更好的方法来做到这一点?

我需要所有输入通道对输出通道具有平等的权利 - 即我不能从一个通道获得所有输出,然后从下一个通道获得所有输出,等等。


对于任何感兴趣的人 - 这是修复后的最终代码和正确(大概)使用sync.WaitGroup

import (
    "math/big"
    "sync"
)

/*
  Multiplex a number of channels into one.
*/
func Mux(channels []chan big.Int) chan big.Int {
    // Count down as each channel closes. When hits zero - close ch.
    var wg sync.WaitGroup
    wg.Add(len(channels))
    // The channel to output to.
    ch := make(chan big.Int, len(channels))

    // Make one go per channel.
    for _, c := range channels {
        go func(c 

正确答案

每个生成的 goroutineMux最终都从同一个通道中提取,因为c在循环的每次迭代中都会更新——它们不只是捕获c. 如果您将通道传递给 goroutine,您将获得预期的结果,如下所示:

for _, c := range channels {
    go func(c 

您可以在此处测试此修改。

另一个可能的问题是您对n变量的处理:如果您正在运行GOMAXPROCS != 1,您可能有两个 goroutines 试图一次更新它。该sync.WaitGroup类型将是等待 goroutine 完成的更安全的方式。

今天关于《通道多路复用器》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!

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