父gorutine退出后子gorutine没有停止[duplicate]

1hdlvixo  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(180)

此问题在此处已有答案

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...
5f0d552i

5f0d552i1#

我想你是在问为什么当创建它的goroutine退出时,它不退出。(当它退出时,整个程序包括所有的goroutine都退出),goroutine在启动时是独立的--它们没有“父进程”,也没有办法从外部阻止它们,包括终止启动它们的goroutine,如果你希望一个goroutine是可终止的,那么你必须自己编写代码,比如当传入的上下文被取消时,从goroutine返回。

相关问题