为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中实现“事件”(带有通知器/接收器)的概念?

在 Golang 中实现“事件”(带有通知器/接收器)的概念?

Go
小唯快跑啊 2022-03-07 16:06:34
我想知道在 Golang 中处理“事件”(带有通知器/接收器)概念的正确方法是什么。我想我需要使用频道,但不确定最好的方法。具体来说,我有以下两个工人的程序。在某些情况下,“worker1”进入和退出“快速模式”并通过通道通知。“worker2”然后可以接收此事件。这工作得很好,但是这两个工人是紧密耦合的。特别是,如果 worker2 没有运行,worker1 在写入通道时会卡住等待。在 Golang 中实现这个逻辑的最佳方式是什么?基本上,一个工人做某事并通知任何其他工人它已经这样做了。其他worker是否监听这个事件一定不能阻塞worker1。理想情况下,可以有任意数量的工人可以收听此事件。有什么建议吗?var fastModeEnabled = make(chan bool)var fastModeDisabled = make(chan bool)func worker1() {    mode := "normal"    for {        // under some conditions:        mode := "fast"        fastModeEnabled <- true        // later, under different conditions:        mode := "normal"        fastModeDisabled <- true    }}func worker2() {    for {        select {        case <-fastModeEnabled:            fmt.Println("Fast mode started")        case <-fastModeDisabled:            fmt.Println("Fast mode ended")        }    }}func main() {    go worker2()    go worker1()    for {}}
查看完整描述

1 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

对通道使用非阻塞写入。这样,如果有人在听,他们就会收到它。如果没有人在收听,它不会阻止发送者,尽管事件丢失了。


您可以使用缓冲通道,以便在需要时至少缓冲一些事件。


select您可以通过使用带有默认大小写的关键字来实现非阻塞发送。默认设置为非阻塞。如果没有默认情况,选择将阻塞,直到其中一个通道可用。


代码片段:


select {

    case ch <- event:

        sent = true

    default:

        sent = false

}


查看完整回答
反对 回复 2022-03-07
  • 1 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信