登录
首页 >  Golang >  Go问答

使用管道通信实现先进先出(FIFO)数据处理

来源:stackoverflow

时间:2024-03-06 12:45:27 178浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《使用管道通信实现先进先出(FIFO)数据处理》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我正在尝试使用一个简单的假示例在 go 中编写一个顺序处理管道。它遍历一个假目录并运行一些转换。所以他们之间有一个共享的字符串通道。一个函数写入数据后,第二个函数读取它。

在我看来,当我在 walkfakedirectory 函数前面放置一个 go 关键字时,它只能工作并且也可以按顺序工作,如下面的代码示例所示(演示)。

如果有人能解释它是如何工作的,我将不胜感激?

package main 
import (
"fmt"
"strings"
"sync"
"time"
)

func main() {

done := make(chan int)
path := make(chan string)

defer close(done)

//var wg sync.WaitGroup - Not working too
//wg.Add(1)

fmt.Println("walking file path")

go WalkFakeDirectoy(done, path)

//wg.Add(1)

ConvertToUpperCase(path, done)

//wg.Wait()

fmt.Println("done!")
//time.Sleep(2000) // Not working 
}

func ConvertToUpperCase(files chan string, done chan int) {

   for file := range files {
      fmt.Println("converting data data", strings.ToUpper(file))
   }
}

func WalkFakeDirectoy(done chan int, path chan<- string) {

   func() {
    list := []string{"abc", "def", "fgh", "ijk", "mnn"}

    for _, file := range list {
        fmt.Println("getting data", file)
        path <- file
        time.Sleep(3000)
      }
   }()
}

解决方案


This Go blog post 关于管道应该有足够的信息来构建您自己的管道。它的要点是一个代码示例:

func gen(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    return out
}

func sq(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        for n := range in {
            out <- n * n
        }
        close(out)
    }()
    return out
}
func sample_pipeline() {
    // Set up the pipeline.
    c := gen(2, 3)
    out := sq(c)
    out2 := sq(out)

    // Consume the output.
    for o := range out2 {
        fmt.Println(o)
    }
}

func main() {
    sample_pipeline()
}

sq 是一个管道阶段 - 它接受一个带有输入的通道并返回一个带有输出(输入的平方值)的通道。 sample_pipeline 设置一个两级管道并将具有两个值的生成器连接到它。

重要的是要注意完成是如何完成的 - 每个管道阶段都是一个执行管道阶段工作的 goroutine(等待来自输入管道的新数据,处理它,发送输出)。当每个阶段的输入管道完成时(通道上的范围循环停止),它会关闭自己的通道。关闭通道是 go 中发出“此通道已完成”信号的规范方式。

本篇关于《使用管道通信实现先进先出(FIFO)数据处理》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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