gpt4 book ai didi

multithreading - 在 Golang 中实现 "events"(带有通知程序/接收程序)的概念?

转载 作者:IT王子 更新时间:2023-10-29 02:33:09 25 4
gpt4 key购买 nike

我想知道在 Golang 中处理“事件”概念(使用通知程序/接收程序)的正确方法是什么。我想我需要使用 channel ,但不确定最佳方式。

具体来说,我有两个 worker 的程序如下。在某些情况下,“worker1”进入和退出“快速模式”并通过 channel 通知这一点。 “worker2”然后可以接收此事件。这工作正常,但是这两个 worker 紧密耦合。特别是,如果 worker2 没有运行,worker1 在写入 channel 时会卡住等待。

在 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 {}
}

最佳答案

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

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

您可以使用带有默认大小写的 select 关键字来实现非阻塞发送。默认使其成为非阻塞的。如果没有默认情况,select 将阻塞,直到其 channel 之一可用为止。

代码片段:

select {
case ch <- event:
sent = true
default:
sent = false
}

关于multithreading - 在 Golang 中实现 "events"(带有通知程序/接收程序)的概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39253204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com