欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 实现多goroutine之间的发布和订阅

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

2025/4/7 16:36:31 来源:https://blog.csdn.net/qiqi123j/article/details/141332391  浏览:    关键词:实现多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 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)
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词