实现多goroutine之间的发布和订阅

server/2024/10/18 8:37:46/

实现多goroutine之间的发布和订阅

一、实现思路

  • 一个发布者,三个订阅者
  • 发布者需要跟每个订阅者之间,都要建立一个chan
  • 调用发布方法后,三个订阅者都能收到发布的信息
  • 在发布和接收之间,增加暂停,使运行结果更加直观

二、实现代码

func Test_Main(t *testing.T) {sl := NewSubList()// 增加A的订阅sl.Subscribe("A", make(Broadcast))// 增加B的订阅sl.Subscribe("B", make(Broadcast))// 增加C的订阅sl.Subscribe("C", make(Broadcast))Sleep(3)sl.PublishMessage("Hello World!")Sleep(3)sl.PublishMessage("Golang very good!")sl.Unsubscribe("B")Sleep(3)sl.PublishMessage("Golang so easy!")
}type Broadcast chan stringtype SubList struct {CH map[string]Broadcastsync.RWMutex
}func NewSubList() *SubList {s := &SubList{}s.CH = make(map[string]Broadcast) //所有channelreturn s
}// Subscribe 订阅
func (s *SubList) Subscribe(name string, bc Broadcast) {s.Lock()s.CH[name] = bcs.Unlock()go s.ListeningBroadcast(name, bc)
}// Unsubscribe 取消订阅
func (s *SubList) Unsubscribe(name string) {s.Lock()delete(s.CH, name)s.Unlock()
}//发布消息
func (s *SubList) PublishMessage(message string) {s.RLock()for k, v := range s.CH {v <- messagefmt.Println("向 ", k, " 发送 ", message)}s.RUnlock()
}// ListeningBroadcast 监听信息
func (s *SubList) ListeningBroadcast(name string, bc Broadcast) {for {message := <-bctime.Sleep(time.Duration(1) * time.Second)fmt.Println(name, " 收到 ", message)}
}func Sleep(i int64)  {fmt.Println("等待3秒……")time.Sleep(time.Duration(i) * time.Second)
}

http://www.ppmy.cn/server/103219.html

相关文章

EMC学习笔记4——传导骚扰发射

传导骚扰发射是最基本的实验项目&#xff0c;主要是检测设备在工作时是否通过电源线产生过强的骚扰发射。 一、传导骚扰发射判断 可以通过两个方面来判断设备是否产生了传导发射&#xff1a; 1.电流的时域波形判断&#xff1a;电流波形与电压的波形不一样。如下图所示&#xf…

大模型Prompt trick:利用大模型同情心提升模型性能

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 swift与Internvl下的多模态大模型分布式微调指南&#xff08;附代码和数据&#xff…

C# NX二次开发-曲线投影到面上

效果&#xff1a; 代码&#xff1a;根据投影方向投影投影新曲线到面上 var pcb workPart.Features.CreateProjectCurveBuilder(null);pcb.CurveFitData.Tolerance 0.001;pcb.CurveFitData.AngleTolerance 0.05;pcb.SectionToProject.DistanceTolerance 0.001;pcb.SectionT…

Java二十三种设计模式-迭代子模式(16/23)

迭代器模式&#xff1a;顺序访问集合的稳健方式 引言 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许顺序访问一个集合对象中的各个元素&#xff0c;而不需要暴露集合的底层表示。 基础知识&#xff0c;java设计模式总体来说设计…

自制深度学习推理框架之Tensor模板类的设计与实现

文章目录 一、Tensort介绍二、Armadillo实现Tensor模板类2.1 tensor类模板2.2 Tensor类的设计2.2.1 矩阵存储顺序2.2.2 Tensor类具体实现 一、Tensort介绍 张量&#xff08;Tensor&#xff09;是一个多维数组的通用化概念&#xff0c;在数学和计算科学中被广泛使用&#xff0c…

如何在 3 分钟内免费在 AWS 上运行 RStudio

欢迎来到雲闪世界。谈到数据分析&#xff0c;我有理由从本地计算机迁移到云端。最突出的是&#xff0c;您可以运行无限数量的机器&#xff0c;而无需拥有或维护它们。此外&#xff0c;您可以在几分钟内根据需要扩大或缩小规模。如果您选择运行 t2.micro 服务器&#xff0c;您可…

ansync/await 运行流程图

1、流程图&#xff1a; 2、await 之后的方法是何时执行&#xff0c;如何执行的&#xff1f; await 的方法在 Task 执行完成之后&#xff0c;通过调用 Finish 方法执行的。 具体的执行步骤是先将 MoveNext 方法注册到 Task 的回调里&#xff0c;然后在 Task 执行完后调用这个方法…

指针 (四)

一 . 指针的使用和传值调用 &#xff08;1&#xff09;strlen 的模拟实现 库函数 strlen 的功能是求字符串长度&#xff0c;统计的是字符串中 \0 之前的字符个数&#xff0c;函数原格式如下&#xff1a; 我们的参数 str 接收到一个字符串的起始地址&#xff0c;然后开始统计…