首页 > 其他分享 >go并发模式 tee-channel

go并发模式 tee-channel

时间:2024-07-10 13:19:59浏览次数:10  
标签:tee 并发 context 博主 go channel

package main

import (
    "context"
    "fmt"
    "time"
)

func teeChannel(ctx context.Context, value <-chan int) (<-chan int, <-chan int) {
    ch1 := make(chan int)
    ch2 := make(chan int)

    go func() {
        defer close(ch1)
        defer close(ch2)
        for v := range value {
            var ch1, ch2 = ch1, ch2
            for i := 0; i < 2; i++ {
                select {
                case <-ctx.Done():
                    return
                case ch1 <- v:
                    ch1 = nil //避免重复发送,置空
                case ch2 <- v:
                    ch2 = nil
                }
            }
        }
    }()

    return ch1, ch2
}

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

    stream := make(chan int)

    ch1, ch2 := teeChannel(ctx, stream)

    go func() {
        defer close(stream)
        for i := 0; i < 5; i++ {
            stream <- i + 1
            time.Sleep(time.Millisecond * 100)
        }
    }()

    for {
        select {
        case <-ctx.Done():
            return
        case v, ok := <-ch1:
            if !ok {
                return
            }
            fmt.Printf("ch1:%d \n", v)
        case v, ok := <-ch2:
            if !ok {
                return
            }
            fmt.Printf("ch2:%d \n", v)
        }
        if ch1 == nil && ch2 == nil {
            break
        }
    }
    fmt.Println("All Done")
}

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

标签:tee,并发,context,博主,go,channel
From: https://www.cnblogs.com/facetwitter/p/18293868

相关文章

  • 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......
  • AI绘画comfyui工作流,商业海报设计、Logo设计,一个comfyui工作流就能搞定!
    前言创新设计工作流:轻松打造LOGO和海报本文涉及的工作流和插件,需要的朋友请扫描免费获取哦—HAPPYNEWYEAR—大家好!今天我要分享的是一个高效且创新的设计工作流,这一工具由国外的网友无私分享,适用于LOGO设计和海报创作。这不仅是对开源精神的致敬,也为我们的设计工......
  • 21、Django-缓存(强缓存和协商缓存)-@cache-page()装饰器
    定义:缓存是一类可以更快的读取数据的介质的统称、也指其它可以加快数据读取的存储方式、一般用来存储临时数据、常用介质的是读取速度很快的内存意义:视图渲染有一定的成本、数据库的频繁查询过高、所以对于低频变动的页面可以考虑使用缓存技术、减少实际渲染的次数、用户拿到相......
  • 20、Django-会话-cookie和session-2
    session是在服务器上开辟一段空间用于保留和服务器交互时的重要数据实现方式:--使用session需要在浏览器客户端启动cookie、且在cookie中存储session--每个客户端都可以在服务器端有一个独立的session--注意:不同的请求者之间不会共享这个数据、与请求者一一对应......
  • 19、Django-会话-cookie和session-1
    会话定义:--从打开浏览器访问一个网站开始到关闭浏览器为止、称之为一次会话--http协议是无状态的、导致会话状态难以保持cookie和session就是为了保持会话的技术cookies:--保存在客户端浏览器上的存储空间--查看cookie:--chrom:开发者工具-》Application-......
  • 18、Django-admin管理后台-Meta类
    1、先执行数据库迁移--pythonmanage.pymakemigrations--pythonmanage.pymigrate2、在cmd终端先创建管理员账户--pythonmanage.pycreatesuperuser3、登录--http://127.0.0.1:8000/admin/  注册自定义的模型类若要自己定义的模型类也能在/admin后台......
  • 17、Django-聚合查询-原生sql语句操作raw()
    聚合查询:整表聚合和分组聚合 1、整表聚合--不带分组的聚合查询是指:将全部数据进行集中统计查询--需要导入:--fromdjango.db.modelsimport*--聚合函数:Sum,Avg,Count,Max,Min--语法:--<model_name>.objects.aggregate(结果变量名=聚合函数('字段名'))......
  • 26、Django内建用户系统
    官方文档:https://docs.djangoproject.com/en/2.2/topics/auth 基本字段模型类位置:--fromdjango.contrib.auth.modelsimportUser   ......