开俩个协程,一个协程生产数据,另一个协程对数据进行处理,处理完后再把数据发回去,使用管道如何实现?

本文阅读 1 分钟
首页 golang 正文
题目来源:京东

答案:古尔班通

该问题适合使用pipeline模式(pipeline是一系列将数据输入,执行操作并将数据传回的系统,我们称这些操作都是pipeline的一个stage),代码如下:
package main

import (
    "fmt"
    "math/rand"
)

func main() {
    // 随机数生成器
    producer := func(num int, done <-chan struct{}) <-chan int {
        produceStream := make(chan int)
        go func() {
            defer close(produceStream)
            for i := 0; i < num; i++ {
                select {
                case <-done:
                    return
                case produceStream <- rand.Intn(99):
                }
            }
        }()
        return produceStream
    }

    // 随机数倍增器
    consumer := func(done <-chan struct{}, produceStream <-chan int) <-chan int {
        consumerStream := make(chan int)
        go func() {
            defer close(consumerStream)
            for v := range produceStream {
                select {
                case <-done:
                    return
                case consumerStream <- v * 2:

                }
            }

        }()
        return consumerStream
    }

    done := make(chan struct{})
    defer close(done)

    produceStream := producer(10, done)
    consumerStream := consumer(done, produceStream)

    for output := range consumerStream {
        fmt.Println("Output: ", output)
    }

}
本文来自投稿,不代表本站立场,如若转载,请注明出处:
了解中间件吗?有什么好处?
« 上一篇 09-17
Go 高并发的特点
下一篇 » 09-17

发表评论

发表评论