此问题在此处已有答案:
cancel a blocking operation in Go(2个答案)
How to kill running goroutines from outside? [duplicate](3个答案)
how to terminate the function called from a goroutine [duplicate](1个答案)
Cancelling user specific goroutines [closed](2个答案)
Goroutine Timeout(2个答案)
10天前关闭。
我有这样的代码:
func sleep(d time.Duration, ch chan<- int) {
fmt.Println("Sleeping...")
time.Sleep(d)
fmt.Println("Awake...")
ch <- 0
}
func parent(ctx context.Context) int {
ch := make(chan int, 1)
go sleep(3*time.Second, ch)
select {
case <-ctx.Done():
return 1
case <-ch:
return 0
}
}
func app(wg *sync.WaitGroup) {
defer wg.Done()
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
res := parent(ctx)
fmt.Println(res)
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
go app(&wg)
wg.Wait()
time.Sleep(2 * time.Second)
}
在本例中,我有一个超时时间为2秒的ctx
。childFunc
需要3秒钟才能结束其进程。
2秒后,由于case <-ctx.Done()
,parent
函数返回1。
但是在主线程中,我又休眠了2秒,我看到childFund
没有退出,正在继续它的进程,Awake...
将被打印。
为什么当childFunc
的父goroutine结束时,它还没有退出呢?
输出如下:
Sleeping...
1
Awake...
1条答案
按热度按时间5f0d552i1#
我想你是在问为什么当创建它的goroutine退出时,它不退出。(当它退出时,整个程序包括所有的goroutine都退出),goroutine在启动时是独立的--它们没有“父进程”,也没有办法从外部阻止它们,包括终止启动它们的goroutine,如果你希望一个goroutine是可终止的,那么你必须自己编写代码,比如当传入的上下文被取消时,从goroutine返回。