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

实现多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 string

type SubList struct {
	CH map[string]Broadcast
	sync.RWMutex
}

func NewSubList() *SubList {
	s := &SubList{}
	s.CH = make(map[string]Broadcast) //所有channel
	return s
}

// Subscribe 订阅
func (s *SubList) Subscribe(name string, bc Broadcast) {
	s.Lock()
	s.CH[name] = bc
	s.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 <- message
		fmt.Println("向 ", k, " 发送 ", message)
	}
	s.RUnlock()
}

// ListeningBroadcast 监听信息
func (s *SubList) ListeningBroadcast(name string, bc Broadcast) {
	for {
		message := <-bc
		time.Sleep(time.Duration(1) * time.Second)
		fmt.Println(name, " 收到 ", message)
	}
}

func Sleep(i int64)  {
	fmt.Println("等待3秒......")
	time.Sleep(time.Duration(i) * time.Second)
}
相关推荐
小码哥_常2 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
紧跟先前的步伐4 小时前
Go AI Agent 实战 24|工具系统工程化收尾与阶段验收
人工智能·ai·golang·1024程序员节
学长毕设4 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
日日大王学编程6 小时前
#Feed 流项目复盘:Redis 时间线缓存与 Outbox 消息可靠性设计
golang·1024程序员节
努力的小雨7 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
excel8 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
AI入职记9 小时前
AI 代码审查召回率实测:20 个骗过单元测试的变异体,抓到 13 个
后端
浮链序9 小时前
别让 AI 客服把用户当猴耍:百来行 Python 把「转人工」做成一条高可用链路
后端
属于自己的天空9 小时前
Claude Code 插件完全指南:官方市场怎么用,怎么自己写(v2.1.269+)
后端
Tokenfree9 小时前
给大模型调用加一个熔断器:60 行代码,三个阈值
后端