如何杀死正在阻塞的goroutine。一个想法是从主机函数返回将是一个解决方案,但我不确定这是否杀死goroutine。
func myFunc() int {
c := make(<-chan int)
go func(){
for i := range c {
// do stuff
}
}()
return 0 // does this kills the inner goroutine?
}
还有更好的解决方案吗?例如,像这样的工作会很好,但是由于它的阻塞而不会:
func myFunc() int {
c := make(<-chan int)
closeChan := make(chan int)
go func() {
select {
case close := <-closeChan:
return 0
default:
for i := range c {
// do stuff
}
}
}()
closeChan<-0
// other stuff
}
答案 0 :(得分:1)
您无法从外部杀死goroutine-您甚至无法引用特定goroutine;也不能中止阻止操作。但是,您可以将for
移到外面:
go func() {
for {
select {
case close := <-closeChan:
return 0
case i,ok := <-c:
// do stuff
if !ok {
// channel is closed & empty
return 0
}
}
}
}()
这将永远循环,每次迭代将在两个通道上等待消息;谁先收到一条消息,将对其进行处理,然后重复循环。这是Go中非常常见的模式。