【发布时间】:2021-09-11 16:21:33
【问题描述】:
对于通道中的每个新值,都会产生一个 goroutine。当通道中有新值时,我希望启动一个新的 goroutine,并杀死旧的 goroutine。我怀疑我的代码正在杀死新的 goroutine 并保持第一个 goroutine 存活。我该如何解决这个问题?
func Start() {
go func() {
quit := make(chan bool, 1)
for nbp := range poll() {
quit <- true
go create(nbp, quit)
}
}()
}
func create(nbp map[string]string, , quit chan bool) {
for {
select {
case <-quit:
fmt.Println("quiting this goroutine!")
return
default:
for k, v := range nbp {
...
}
time.Sleep(3 * time.Second)
}
}
}
【问题讨论】:
-
因为你的频道是缓冲的,你可以在没有阻塞的情况下推送第一个项目,因此,当例程在
go create(nbp, quit)产生时,它会进入选择并在退出频道中找到一个值。因此,它退出了...... -
当我从缓冲区中删除 1 时,什么也没有发生......
-
是的,它会阻止等待读取它的内容。
-
介意我问:为什么?通道和例程是卸载一些要同时完成的工作的好工具。如果您等待通道上的新值,终止一个例程并在其位置启动完全相同的例程,为什么不简单地保持第一个例程运行,并在新数据进入时处理它?
-
@testing495 我已经发布了一个包含 3 个选项的答案。最后一个是我将如何去做。因为它使用循环 (
for nbp := range ch),所以旧地图无论如何都不会保存在内存中,并且不需要使用bool的通道(实际上应该是struct{},因为它是 0 字节类型) .