在 Golang 中实现 "events"(使用 notifiers/receivers)的概念?
Implementing the concept of "events" (with notifiers/receivers) in Golang?
我想知道在 Golang 中处理 "events"(使用 notifiers/receivers)概念的正确方法是什么。我想我需要使用频道,但不确定最好的方法。
具体来说,我有两个工人的程序如下。在某些情况下,"worker1" 进出 "fast mode" 并通过渠道通知这一点。 "worker2" 可以收到这个事件。这工作正常,但是这两个工人紧密耦合。特别是,如果 worker2 不是 运行,worker1 在写入通道时会卡住等待。
在 Golang 中实现此逻辑的最佳方式是什么?基本上,一个 worker 做某事并通知任何其他 worker 它已经这样做了。其他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 {}
}
对通道使用非阻塞写入。这样,如果有人在听,他们就会收到。如果没有人收听它不会阻止发件人,尽管事件丢失了。
您可以使用缓冲通道,以便在需要时至少缓冲一些事件。
您通过使用带有默认大小写的 select
关键字来实现非阻塞发送。默认使其成为非阻塞的。如果没有默认情况,select 将阻塞,直到其通道之一可用。
代码片段:
select {
case ch <- event:
sent = true
default:
sent = false
}
我想知道在 Golang 中处理 "events"(使用 notifiers/receivers)概念的正确方法是什么。我想我需要使用频道,但不确定最好的方法。
具体来说,我有两个工人的程序如下。在某些情况下,"worker1" 进出 "fast mode" 并通过渠道通知这一点。 "worker2" 可以收到这个事件。这工作正常,但是这两个工人紧密耦合。特别是,如果 worker2 不是 运行,worker1 在写入通道时会卡住等待。
在 Golang 中实现此逻辑的最佳方式是什么?基本上,一个 worker 做某事并通知任何其他 worker 它已经这样做了。其他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 {}
}
对通道使用非阻塞写入。这样,如果有人在听,他们就会收到。如果没有人收听它不会阻止发件人,尽管事件丢失了。
您可以使用缓冲通道,以便在需要时至少缓冲一些事件。
您通过使用带有默认大小写的 select
关键字来实现非阻塞发送。默认使其成为非阻塞的。如果没有默认情况,select 将阻塞,直到其通道之一可用。
代码片段:
select {
case ch <- event:
sent = true
default:
sent = false
}