我怎样才能杀死一个正在阻塞的 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}
1 回答
温温酱
TA贡献1752条经验 获得超4个赞
你不能从外部杀死一个 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 中非常常见的模式。
- 1 回答
- 0 关注
- 82 浏览
添加回答
举报
0/150
提交
取消