首页 > 其他分享 >go并发模式 or-do-channel + bridge

go并发模式 or-do-channel + bridge

时间:2024-07-10 13:20:21浏览次数:16  
标签:bridge orDone do 博主 go channel

package main

import (
    "context"
    "fmt"
)
// orDone
func orDone(ctx context.Context, value <-chan int) <-chan int {
    ordoneStream := make(chan int)
    go func() {
        defer close(ordoneStream)
        for {
            select {
            case <-ctx.Done():
                return
            case v, ok := <-value:
                if !ok {
                    return
                }
                select {
                case <-ctx.Done():
                    return
                case ordoneStream <- v:
                }
            }
        }
    }()
    return ordoneStream
}

// bridge
func bridge(ctx context.Context, value <-chan <-chan int) <-chan int {
    bridgeStream := make(chan int)
    go func() {
        defer close(bridgeStream)
        for {
            var stream <-chan int
            select {
            case <-ctx.Done():
                return
            case v, ok := <-value:
                if !ok {
                    return
                }
                stream = v
            }
            for i := range orDone(ctx, stream) {
                select {
                case <-ctx.Done():
                    return
                case bridgeStream <- i:
                }
            }
        }
    }()
    return bridgeStream
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    ch1 := make(chan int)
    ch2 := make(chan int)
    ch3 := make(chan int)
    stream := make(chan (<-chan int))

    go func() {
        defer close(stream)
        stream <- ch1
        stream <- ch2
        stream <- ch3
    }()

    go func() {
        defer close(ch1)
        for i := 0; i < 3; i++ {
            ch1 <- i + 1
        }
    }()

    go func() {
        defer close(ch2)
        for i := 0; i < 3; i++ {
            ch2 <- i + 11
        }
    }()

    go func() {
        defer close(ch3)
        for i := 0; i < 3; i++ {
            ch3 <- i + 21
        }
    }()

    for val := range bridge(ctx, stream) {
        fmt.Println(val)
    }

}

 【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/facetwitter/p/18293865

标签:bridge,orDone,do,博主,go,channel
From: https://www.cnblogs.com/facetwitter/p/18293865

相关文章

  • go并发模式 tee-channel
    packagemainimport("context""fmt""time")functeeChannel(ctxcontext.Context,value<-chanint)(<-chanint,<-chanint){ch1:=make(chanint)ch2:=make(chanint)gofunc(){......
  • go并发模式 pipeline
    packagemainimport("fmt""math/rand")funcmain(){pFn:=func(done<-chaninterface{},fnfunc()int)<-chanint{valueStream:=make(chanint)gofunc(){deferclose(valueStream)......
  • go并发模式 错误处理
    packagemainimport("fmt""net/http")typeResultsstruct{ErrorerrorResponse*http.Response}funcmain(){checkStatus:=func(done<-chaninterface{},urls...string)<-chanResults{re......
  • go并发模式 扇入扇出
    扇入扇出寻找素数:packagemainimport("fmt""math/rand""runtime""sync""time")varrepeatFn=func(done<-chaninterface{},fnfunc()interface{})<-chaninterface{}{valueSt......
  • Windows下升级JDK
    1.官网下载安装包,官网地址:https://www.oracle.com/cn/java/technologies/downloads/#jdk21-windows 2.java-version检查现有jdk版本3.修改环境变量 4.  java-version检查jdk版本,未生效 输出环境变量,发现确实配置已经成功 5.重启电脑,搞定 ......
  • .Net Core WebApi项目 Development模式下报错 System.InvalidOperationException 解决
    .NetCoreWebApi项目Development模式下报错System.InvalidOperationException:“Cannotresolvescopedservice'Microsoft.Extensions.Options.IOptionsSnapshot`1[Infrastructure.OptionsSetting]'fromrootprovider.” 但是在Production模式下,运行正常因为未设置的......
  • docker指定容器抓包
    服务端开发时,有的时候不方便断点调试,只能进行抓包确认问题。如果是服务器安装了多个docker,会导致网络非常复杂,需要直接对container抓包,便于跟踪问题。确定container对应的网卡方法如下进入容器dockerexec-ti<containerid>执行命令cat/sys/class/net/eth0/iflin......
  • Docker-搭建部署Jenkins(保姆篇)
    文章目录Jenkins部署拉取镜像启动容器查看初始密码关闭CSRFJenkins页面使用解决插件下载缓慢访问jenkins页面推荐插件安装创建一个管理员账号实例配置页面展示更多相关内容可查看Jenkins部署拉取镜像如果想拉取对应版本请指明版本号dockerpulljenkins/jenki......
  • 如何在 Windows 10 上恢复未保存的 Word 文档
    您是否整晚都在处理一个重要的word文件,但忘记保存它了?本文适合您。在这里,我们将解释如何恢复未保存的word文档。除此之外,您还将学习如何恢复已删除的word文档。从专业人士到高中生,每个人都了解丢失重要Word文件的痛苦。幸运的是,有多种方法可以恢复未保存和已删除的Wo......
  • ab for windows
    Windows上安装和使用ab压测Apachebench是一款压力测试工具,用于测试http服务请求的性能情况1下载http://httpd.apache.org/docs/current/platform/windows.html#down #管理员模式进入CMD C:>d:  D:\>cdapache  D:\apache>cdApache24  D:\apache\Apache24>c......